@sideboard-ai/core 0.1.115 → 0.1.116

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.
@@ -399,7 +399,7 @@ function cursorSdkMessageToEvents(msg) {
399
399
  if (msg.type === "tool_call" && msg.call_id && msg.name) {
400
400
  const normalized = normalizeCursorToolCall(msg.name, msg.args);
401
401
  if (msg.status === "running") {
402
- return [
402
+ const events = [
403
403
  {
404
404
  type: "tool_use",
405
405
  id: msg.call_id,
@@ -407,6 +407,16 @@ function cursorSdkMessageToEvents(msg) {
407
407
  input: normalized.input
408
408
  }
409
409
  ];
410
+ const live = unwrapCursorToolResult(msg.result);
411
+ if (live) {
412
+ events.push({
413
+ type: "tool_result",
414
+ id: msg.call_id,
415
+ content: live,
416
+ partial: true
417
+ });
418
+ }
419
+ return events;
410
420
  }
411
421
  if (msg.status === "completed" || msg.status === "error") {
412
422
  return [
@@ -467,6 +477,17 @@ function nestedUpdateToEvents(update, parentId) {
467
477
  isError: cursorToolResultIsError(void 0, update.toolCall.result),
468
478
  parentId
469
479
  });
480
+ } else {
481
+ const live = unwrapCursorToolResult(update.toolCall.result);
482
+ if (live) {
483
+ events.push({
484
+ type: "tool_result",
485
+ id: update.callId,
486
+ content: live,
487
+ partial: true,
488
+ parentId
489
+ });
490
+ }
470
491
  }
471
492
  return events;
472
493
  }
@@ -7,7 +7,7 @@ import {
7
7
  cursorSdkMessageToEvents,
8
8
  ensureCursorRipgrepPath,
9
9
  formatUnknownDetail
10
- } from "../chunk-SLU5JVKD.js";
10
+ } from "../chunk-GBY7OOMB.js";
11
11
  import {
12
12
  dropNestedElectronEnvFromProcess
13
13
  } from "../chunk-4TR3HZFT.js";
@@ -28,7 +28,7 @@ import {
28
28
  resolveCursorModelId,
29
29
  resolveLoginCommand,
30
30
  resolveQuotaFallbackAgent
31
- } from "./chunk-C6OBY6IC.js";
31
+ } from "./chunk-5KSLD4MU.js";
32
32
  import "./chunk-EKIDHL2T.js";
33
33
  import {
34
34
  ORCHESTRATOR_AGENT_KINDS,
@@ -40,7 +40,7 @@ import "./chunk-7WC5UWEB.js";
40
40
  import {
41
41
  cursorSdkMessageToEvents,
42
42
  parseCursorRunnerLine
43
- } from "./chunk-SLU5JVKD.js";
43
+ } from "./chunk-GBY7OOMB.js";
44
44
  import "./chunk-FZCIQYNQ.js";
45
45
  import "./chunk-FKOIHGKV.js";
46
46
  import "./chunk-4NR5FL46.js";
@@ -32,7 +32,7 @@ import {
32
32
  resolveCursorModelId,
33
33
  resolveLoginCommand,
34
34
  resolveQuotaFallbackAgent
35
- } from "./chunk-66XTXHR3.js";
35
+ } from "./chunk-OFF5AFCR.js";
36
36
  import "./chunk-YMRT2DU6.js";
37
37
  import {
38
38
  ORCHESTRATOR_AGENT_KINDS,
@@ -28,7 +28,7 @@ import {
28
28
  summarizeTurnStderr,
29
29
  toolDescription,
30
30
  turnFailChatText
31
- } from "./chunk-66XTXHR3.js";
31
+ } from "./chunk-OFF5AFCR.js";
32
32
  import {
33
33
  addWorkspace,
34
34
  ensureWorkspace,
@@ -2410,7 +2410,7 @@ async function createThread(input, _onSetupLine) {
2410
2410
  return readThread(thread.id) ?? thread;
2411
2411
  }
2412
2412
  async function listLinearIssues(agent, repoPath) {
2413
- const { getAdapter: getAdapter2 } = await import("./agents-AHAFC6FR.js");
2413
+ const { getAdapter: getAdapter2 } = await import("./agents-DU7DHY7A.js");
2414
2414
  await requireAgent(agent, { requireLinear: true });
2415
2415
  const adapter = getAdapter2(agent);
2416
2416
  if (!adapter.listLinearIssues) {
@@ -4646,14 +4646,15 @@ function formatArtifactDirective() {
4646
4646
  return [
4647
4647
  "Sideboard side column (desktop UI):",
4648
4648
  "claude.ai\u2019s \u201CArtifact\u201D tool does NOT exist in Claude Code. That is expected.",
4649
+ "Do not unprompted-duplicate a payload. Chat markdown (including tables) already renders in the transcript \u2014 do not also call present_schema with those same rows just to display them. If the user asks for an editable / interactive table, call present_schema even if markdown already showed the data. Do not also call present_artifact for a document you already fenced in chat.",
4649
4650
  "Documents (HTML/SVG/markdown):",
4650
4651
  "1) Emit a fenced code block tagged `html` (preferred), `svg`, or `markdown` with the FULL document \u2014 Sideboard opens a side column. Example:",
4651
4652
  "```html",
4652
4653
  "<!DOCTYPE html><html><head><title>Demo</title></head><body><h1>Hi</h1></body></html>",
4653
4654
  "```",
4654
- "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content.",
4655
+ "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content \u2014 not both a fence and this tool for the same body.",
4655
4656
  "CMS / JSON Schema forms & tables (Brightsy or any schema+schemaUi source):",
4656
- "3) Call Sideboard MCP `present_schema` with title, mode (table|form), and either:",
4657
+ "3) Call Sideboard MCP `present_schema` when the user needs to filter, edit, publish, or persist rows \u2014 including after you already showed a markdown table, if they then ask for an editable table. If they only need to read the data, a markdown table is enough. When you do call it, pass title, mode (table|form), and either:",
4657
4658
  " - datasource=brightsy + resource_id (record type UUID) after fetching types via Brightsy MCP, or",
4658
4659
  " - datasource=inline + resource: { id, title, schema, schemaUi } and optional records/record.",
4659
4660
  "Files / media browser (CMS file manager column):",
@@ -4662,11 +4663,11 @@ function formatArtifactDirective() {
4662
4663
  "Multiple-choice questions:",
4663
4664
  "5) Call Sideboard MCP `ask_user` only when work is blocked on choosing among a few concrete options (approach forks, which API, auth vs cookies). First write a short chat message that explains the decision and what each option means (tradeoffs, when to pick it). Include a description on every option. After calling, stop and wait for their next message with answers. If you are asking a real multiple-choice, use ask_user rather than chat bullets so Sideboard shows the composer picker.",
4664
4665
  "Do not call ask_user for greetings, check-ins, \u201Chello\u201D, open-ended how-can-I-help, or to invent a menu of possible next tasks \u2014 reply in chat. If one option is the obvious default, proceed without asking.",
4665
- "Never say artifacts, CMS UI, or the Files column are unavailable. Prefer present_schema for list/edit/publish; present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
4666
+ "Never say artifacts, CMS UI, or the Files column are unavailable. present_schema is for interactive list/edit/publish (use it when they ask to edit, even if chat already had a markdown table); present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
4666
4667
  ].join("\n");
4667
4668
  }
4668
4669
  function formatUiReminder() {
4669
- return "Sideboard UI: html fence or present_artifact / present_schema / present_files; ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
4670
+ 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. ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
4670
4671
  }
4671
4672
 
4672
4673
  // src/threads/sync-branch.ts
@@ -4937,7 +4938,7 @@ function formatScheduledPrompt(name, prompt) {
4937
4938
  ${prompt}`;
4938
4939
  }
4939
4940
  async function defaultDeps() {
4940
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-GKLYKLRC.js");
4941
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-NXPANCZA.js");
4941
4942
  const orch = getOrchestrator2();
4942
4943
  return {
4943
4944
  findThread: (id) => findThreadByRef(id),
@@ -20,7 +20,7 @@ import {
20
20
  packagedMcpStdioPath,
21
21
  parseCursorRunnerLine,
22
22
  resolveNodeLaunch
23
- } from "./chunk-SLU5JVKD.js";
23
+ } from "./chunk-GBY7OOMB.js";
24
24
  import {
25
25
  codexUnattendedGitConfigArgs,
26
26
  mergeAgentGitAuthEnv,
@@ -669,6 +669,9 @@ function classifyTool(name) {
669
669
  }
670
670
  return "other";
671
671
  }
672
+ function isShellToolName(name) {
673
+ return classifyTool(name ?? "") === "shell";
674
+ }
672
675
  function toolActivityLine(parts) {
673
676
  const tools = parts.filter((p) => {
674
677
  if (p.type !== "tool" || p.parentId) return false;
@@ -916,6 +919,30 @@ function applyAgentEvent(parts, event) {
916
919
  if (event.type === "tool_result") {
917
920
  const existing = parts.findIndex((p) => p.type === "tool" && p.id === event.id);
918
921
  const fromResult = parseDiffStat(event.content);
922
+ if (event.partial) {
923
+ if (existing < 0) {
924
+ return [
925
+ ...parts,
926
+ {
927
+ type: "tool",
928
+ id: event.id,
929
+ name: "tool",
930
+ description: "tool",
931
+ status: event.isError ? "error" : "running",
932
+ result: event.content,
933
+ ...event.parentId ? { parentId: event.parentId } : {}
934
+ }
935
+ ];
936
+ }
937
+ return parts.map((p, i) => {
938
+ if (i !== existing || p.type !== "tool") return p;
939
+ if (p.status === "done" || p.status === "error") return p;
940
+ return {
941
+ ...p,
942
+ result: event.content ?? p.result
943
+ };
944
+ });
945
+ }
919
946
  if (existing < 0) {
920
947
  return [
921
948
  ...parts,
@@ -2031,13 +2058,22 @@ var codexAdapter = {
2031
2058
  const events = [
2032
2059
  { type: "tool_use", id: item.id, name: "Bash", input }
2033
2060
  ];
2034
- if (type === "item.completed" || item.status === "completed" || item.status === "failed") {
2061
+ const finished = type === "item.completed" || item.status === "completed" || item.status === "failed";
2062
+ const output = typeof item.aggregated_output === "string" && item.aggregated_output ? item.aggregated_output : void 0;
2063
+ if (finished) {
2035
2064
  events.push({
2036
2065
  type: "tool_result",
2037
2066
  id: item.id,
2038
- content: item.aggregated_output,
2067
+ content: output,
2039
2068
  isError: item.status === "failed"
2040
2069
  });
2070
+ } else if (output) {
2071
+ events.push({
2072
+ type: "tool_result",
2073
+ id: item.id,
2074
+ content: output,
2075
+ partial: true
2076
+ });
2041
2077
  }
2042
2078
  return events.length === 1 ? events[0] : events;
2043
2079
  }
@@ -2504,13 +2540,16 @@ var opencodeAdapter = {
2504
2540
  );
2505
2541
  const events = [{ type: "tool_use", id, name, input }];
2506
2542
  const output = state?.output;
2507
- if (output != null || state?.status === "completed" || state?.status === "error") {
2543
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
2544
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
2545
+ if (output != null || finished) {
2508
2546
  const content = typeof output === "string" ? output : output != null ? JSON.stringify(output) : formatUnknownDetail(state?.error) || void 0;
2509
2547
  events.push({
2510
2548
  type: "tool_result",
2511
2549
  id,
2512
2550
  content,
2513
- isError: state?.status === "error" || state?.status === "failed"
2551
+ isError: state?.status === "error" || state?.status === "failed",
2552
+ ...running && !finished ? { partial: true } : {}
2514
2553
  });
2515
2554
  }
2516
2555
  return events.length === 1 ? events[0] : events;
@@ -2545,14 +2584,17 @@ var opencodeAdapter = {
2545
2584
  withEventParentId({ type: "tool_use", id, name, input }, parentId)
2546
2585
  ];
2547
2586
  const output = state?.output ?? part.output;
2548
- if (output != null || state?.status === "completed" || state?.status === "error") {
2587
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
2588
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
2589
+ if (output != null || finished) {
2549
2590
  nested.push(
2550
2591
  withEventParentId(
2551
2592
  {
2552
2593
  type: "tool_result",
2553
2594
  id,
2554
2595
  content: typeof output === "string" ? output : output != null ? JSON.stringify(output) : void 0,
2555
- isError: state?.status === "error" || state?.status === "failed"
2596
+ isError: state?.status === "error" || state?.status === "failed",
2597
+ ...running && !finished ? { partial: true } : {}
2556
2598
  },
2557
2599
  parentId
2558
2600
  )
@@ -3107,6 +3149,7 @@ export {
3107
3149
  toolDescription,
3108
3150
  isSubagentToolName,
3109
3151
  isPollWrapperToolName,
3152
+ isShellToolName,
3110
3153
  toolActivityLine,
3111
3154
  liveActivitySummary,
3112
3155
  messagePartParentId,
@@ -17,7 +17,7 @@ import {
17
17
  resolveQuotaFallbackAgent,
18
18
  stripBrightsyNdjsonNoise,
19
19
  toolDescription
20
- } from "./chunk-C6OBY6IC.js";
20
+ } from "./chunk-5KSLD4MU.js";
21
21
  import {
22
22
  addWorkspace,
23
23
  ensureWorkspace,
@@ -63,7 +63,7 @@ import {
63
63
  shouldRetryFailedAgentTurn,
64
64
  summarizeTurnStderr,
65
65
  turnFailChatText
66
- } from "./chunk-SLU5JVKD.js";
66
+ } from "./chunk-GBY7OOMB.js";
67
67
  import {
68
68
  releaseCaffeinateHoldForThread
69
69
  } from "./chunk-DCOZABNT.js";
@@ -2455,7 +2455,7 @@ async function createThread(input, _onSetupLine) {
2455
2455
  return readThread(thread.id) ?? thread;
2456
2456
  }
2457
2457
  async function listLinearIssues(agent, repoPath) {
2458
- const { getAdapter: getAdapter2 } = await import("./agents-3X3EFCQY.js");
2458
+ const { getAdapter: getAdapter2 } = await import("./agents-7NIX44RB.js");
2459
2459
  await requireAgent(agent, { requireLinear: true });
2460
2460
  const adapter = getAdapter2(agent);
2461
2461
  if (!adapter.listLinearIssues) {
@@ -4743,14 +4743,15 @@ function formatArtifactDirective() {
4743
4743
  return [
4744
4744
  "Sideboard side column (desktop UI):",
4745
4745
  "claude.ai\u2019s \u201CArtifact\u201D tool does NOT exist in Claude Code. That is expected.",
4746
+ "Do not unprompted-duplicate a payload. Chat markdown (including tables) already renders in the transcript \u2014 do not also call present_schema with those same rows just to display them. If the user asks for an editable / interactive table, call present_schema even if markdown already showed the data. Do not also call present_artifact for a document you already fenced in chat.",
4746
4747
  "Documents (HTML/SVG/markdown):",
4747
4748
  "1) Emit a fenced code block tagged `html` (preferred), `svg`, or `markdown` with the FULL document \u2014 Sideboard opens a side column. Example:",
4748
4749
  "```html",
4749
4750
  "<!DOCTYPE html><html><head><title>Demo</title></head><body><h1>Hi</h1></body></html>",
4750
4751
  "```",
4751
- "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content.",
4752
+ "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content \u2014 not both a fence and this tool for the same body.",
4752
4753
  "CMS / JSON Schema forms & tables (Brightsy or any schema+schemaUi source):",
4753
- "3) Call Sideboard MCP `present_schema` with title, mode (table|form), and either:",
4754
+ "3) Call Sideboard MCP `present_schema` when the user needs to filter, edit, publish, or persist rows \u2014 including after you already showed a markdown table, if they then ask for an editable table. If they only need to read the data, a markdown table is enough. When you do call it, pass title, mode (table|form), and either:",
4754
4755
  " - datasource=brightsy + resource_id (record type UUID) after fetching types via Brightsy MCP, or",
4755
4756
  " - datasource=inline + resource: { id, title, schema, schemaUi } and optional records/record.",
4756
4757
  "Files / media browser (CMS file manager column):",
@@ -4759,11 +4760,11 @@ function formatArtifactDirective() {
4759
4760
  "Multiple-choice questions:",
4760
4761
  "5) Call Sideboard MCP `ask_user` only when work is blocked on choosing among a few concrete options (approach forks, which API, auth vs cookies). First write a short chat message that explains the decision and what each option means (tradeoffs, when to pick it). Include a description on every option. After calling, stop and wait for their next message with answers. If you are asking a real multiple-choice, use ask_user rather than chat bullets so Sideboard shows the composer picker.",
4761
4762
  "Do not call ask_user for greetings, check-ins, \u201Chello\u201D, open-ended how-can-I-help, or to invent a menu of possible next tasks \u2014 reply in chat. If one option is the obvious default, proceed without asking.",
4762
- "Never say artifacts, CMS UI, or the Files column are unavailable. Prefer present_schema for list/edit/publish; present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
4763
+ "Never say artifacts, CMS UI, or the Files column are unavailable. present_schema is for interactive list/edit/publish (use it when they ask to edit, even if chat already had a markdown table); present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
4763
4764
  ].join("\n");
4764
4765
  }
4765
4766
  function formatUiReminder() {
4766
- return "Sideboard UI: html fence or present_artifact / present_schema / present_files; ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
4767
+ 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. ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
4767
4768
  }
4768
4769
  var FILES_BY_AGENT = {
4769
4770
  claude: [
@@ -5108,7 +5109,7 @@ function formatScheduledPrompt(name, prompt) {
5108
5109
  ${prompt}`;
5109
5110
  }
5110
5111
  async function defaultDeps() {
5111
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-TXASYNHT.js");
5112
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-ZY4RUJKT.js");
5112
5113
  const orch = getOrchestrator2();
5113
5114
  return {
5114
5115
  findThread: (id) => findThreadByRef(id),
@@ -585,7 +585,7 @@ function cursorSdkMessageToEvents(msg) {
585
585
  if (msg.type === "tool_call" && msg.call_id && msg.name) {
586
586
  const normalized = normalizeCursorToolCall(msg.name, msg.args);
587
587
  if (msg.status === "running") {
588
- return [
588
+ const events = [
589
589
  {
590
590
  type: "tool_use",
591
591
  id: msg.call_id,
@@ -593,6 +593,16 @@ function cursorSdkMessageToEvents(msg) {
593
593
  input: normalized.input
594
594
  }
595
595
  ];
596
+ const live = unwrapCursorToolResult(msg.result);
597
+ if (live) {
598
+ events.push({
599
+ type: "tool_result",
600
+ id: msg.call_id,
601
+ content: live,
602
+ partial: true
603
+ });
604
+ }
605
+ return events;
596
606
  }
597
607
  if (msg.status === "completed" || msg.status === "error") {
598
608
  return [
@@ -653,6 +663,17 @@ function nestedUpdateToEvents(update, parentId) {
653
663
  isError: cursorToolResultIsError(void 0, update.toolCall.result),
654
664
  parentId
655
665
  });
666
+ } else {
667
+ const live = unwrapCursorToolResult(update.toolCall.result);
668
+ if (live) {
669
+ events.push({
670
+ type: "tool_result",
671
+ id: update.callId,
672
+ content: live,
673
+ partial: true,
674
+ parentId
675
+ });
676
+ }
656
677
  }
657
678
  return events;
658
679
  }
@@ -1007,6 +1007,30 @@ function applyAgentEvent(parts, event) {
1007
1007
  if (event.type === "tool_result") {
1008
1008
  const existing = parts.findIndex((p) => p.type === "tool" && p.id === event.id);
1009
1009
  const fromResult = parseDiffStat(event.content);
1010
+ if (event.partial) {
1011
+ if (existing < 0) {
1012
+ return [
1013
+ ...parts,
1014
+ {
1015
+ type: "tool",
1016
+ id: event.id,
1017
+ name: "tool",
1018
+ description: "tool",
1019
+ status: event.isError ? "error" : "running",
1020
+ result: event.content,
1021
+ ...event.parentId ? { parentId: event.parentId } : {}
1022
+ }
1023
+ ];
1024
+ }
1025
+ return parts.map((p, i) => {
1026
+ if (i !== existing || p.type !== "tool") return p;
1027
+ if (p.status === "done" || p.status === "error") return p;
1028
+ return {
1029
+ ...p,
1030
+ result: event.content ?? p.result
1031
+ };
1032
+ });
1033
+ }
1010
1034
  if (existing < 0) {
1011
1035
  return [
1012
1036
  ...parts,
@@ -2352,13 +2376,22 @@ var codexAdapter = {
2352
2376
  const events = [
2353
2377
  { type: "tool_use", id: item.id, name: "Bash", input }
2354
2378
  ];
2355
- if (type === "item.completed" || item.status === "completed" || item.status === "failed") {
2379
+ const finished = type === "item.completed" || item.status === "completed" || item.status === "failed";
2380
+ const output = typeof item.aggregated_output === "string" && item.aggregated_output ? item.aggregated_output : void 0;
2381
+ if (finished) {
2356
2382
  events.push({
2357
2383
  type: "tool_result",
2358
2384
  id: item.id,
2359
- content: item.aggregated_output,
2385
+ content: output,
2360
2386
  isError: item.status === "failed"
2361
2387
  });
2388
+ } else if (output) {
2389
+ events.push({
2390
+ type: "tool_result",
2391
+ id: item.id,
2392
+ content: output,
2393
+ partial: true
2394
+ });
2362
2395
  }
2363
2396
  return events.length === 1 ? events[0] : events;
2364
2397
  }
@@ -2579,7 +2612,7 @@ function cursorSdkMessageToEvents(msg) {
2579
2612
  if (msg.type === "tool_call" && msg.call_id && msg.name) {
2580
2613
  const normalized = normalizeCursorToolCall(msg.name, msg.args);
2581
2614
  if (msg.status === "running") {
2582
- return [
2615
+ const events = [
2583
2616
  {
2584
2617
  type: "tool_use",
2585
2618
  id: msg.call_id,
@@ -2587,6 +2620,16 @@ function cursorSdkMessageToEvents(msg) {
2587
2620
  input: normalized.input
2588
2621
  }
2589
2622
  ];
2623
+ const live = unwrapCursorToolResult(msg.result);
2624
+ if (live) {
2625
+ events.push({
2626
+ type: "tool_result",
2627
+ id: msg.call_id,
2628
+ content: live,
2629
+ partial: true
2630
+ });
2631
+ }
2632
+ return events;
2590
2633
  }
2591
2634
  if (msg.status === "completed" || msg.status === "error") {
2592
2635
  return [
@@ -3056,13 +3099,16 @@ var opencodeAdapter = {
3056
3099
  );
3057
3100
  const events = [{ type: "tool_use", id, name, input }];
3058
3101
  const output = state?.output;
3059
- if (output != null || state?.status === "completed" || state?.status === "error") {
3102
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
3103
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
3104
+ if (output != null || finished) {
3060
3105
  const content = typeof output === "string" ? output : output != null ? JSON.stringify(output) : formatUnknownDetail(state?.error) || void 0;
3061
3106
  events.push({
3062
3107
  type: "tool_result",
3063
3108
  id,
3064
3109
  content,
3065
- isError: state?.status === "error" || state?.status === "failed"
3110
+ isError: state?.status === "error" || state?.status === "failed",
3111
+ ...running && !finished ? { partial: true } : {}
3066
3112
  });
3067
3113
  }
3068
3114
  return events.length === 1 ? events[0] : events;
@@ -3097,14 +3143,17 @@ var opencodeAdapter = {
3097
3143
  withEventParentId({ type: "tool_use", id, name, input }, parentId)
3098
3144
  ];
3099
3145
  const output = state?.output ?? part.output;
3100
- if (output != null || state?.status === "completed" || state?.status === "error") {
3146
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
3147
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
3148
+ if (output != null || finished) {
3101
3149
  nested.push(
3102
3150
  withEventParentId(
3103
3151
  {
3104
3152
  type: "tool_result",
3105
3153
  id,
3106
3154
  content: typeof output === "string" ? output : output != null ? JSON.stringify(output) : void 0,
3107
- isError: state?.status === "error" || state?.status === "failed"
3155
+ isError: state?.status === "error" || state?.status === "failed",
3156
+ ...running && !finished ? { partial: true } : {}
3108
3157
  },
3109
3158
  parentId
3110
3159
  )
package/dist/index.cjs CHANGED
@@ -7766,6 +7766,9 @@ function classifyTool(name) {
7766
7766
  }
7767
7767
  return "other";
7768
7768
  }
7769
+ function isShellToolName(name) {
7770
+ return classifyTool(name ?? "") === "shell";
7771
+ }
7769
7772
  function toolActivityLine(parts) {
7770
7773
  const tools = parts.filter((p) => {
7771
7774
  if (p.type !== "tool" || p.parentId) return false;
@@ -8013,6 +8016,30 @@ function applyAgentEvent(parts, event) {
8013
8016
  if (event.type === "tool_result") {
8014
8017
  const existing = parts.findIndex((p) => p.type === "tool" && p.id === event.id);
8015
8018
  const fromResult = parseDiffStat(event.content);
8019
+ if (event.partial) {
8020
+ if (existing < 0) {
8021
+ return [
8022
+ ...parts,
8023
+ {
8024
+ type: "tool",
8025
+ id: event.id,
8026
+ name: "tool",
8027
+ description: "tool",
8028
+ status: event.isError ? "error" : "running",
8029
+ result: event.content,
8030
+ ...event.parentId ? { parentId: event.parentId } : {}
8031
+ }
8032
+ ];
8033
+ }
8034
+ return parts.map((p, i) => {
8035
+ if (i !== existing || p.type !== "tool") return p;
8036
+ if (p.status === "done" || p.status === "error") return p;
8037
+ return {
8038
+ ...p,
8039
+ result: event.content ?? p.result
8040
+ };
8041
+ });
8042
+ }
8016
8043
  if (existing < 0) {
8017
8044
  return [
8018
8045
  ...parts,
@@ -9445,13 +9472,22 @@ var init_codex = __esm({
9445
9472
  const events = [
9446
9473
  { type: "tool_use", id: item.id, name: "Bash", input }
9447
9474
  ];
9448
- if (type === "item.completed" || item.status === "completed" || item.status === "failed") {
9475
+ const finished = type === "item.completed" || item.status === "completed" || item.status === "failed";
9476
+ const output = typeof item.aggregated_output === "string" && item.aggregated_output ? item.aggregated_output : void 0;
9477
+ if (finished) {
9449
9478
  events.push({
9450
9479
  type: "tool_result",
9451
9480
  id: item.id,
9452
- content: item.aggregated_output,
9481
+ content: output,
9453
9482
  isError: item.status === "failed"
9454
9483
  });
9484
+ } else if (output) {
9485
+ events.push({
9486
+ type: "tool_result",
9487
+ id: item.id,
9488
+ content: output,
9489
+ partial: true
9490
+ });
9455
9491
  }
9456
9492
  return events.length === 1 ? events[0] : events;
9457
9493
  }
@@ -9667,7 +9703,7 @@ function cursorSdkMessageToEvents(msg) {
9667
9703
  if (msg.type === "tool_call" && msg.call_id && msg.name) {
9668
9704
  const normalized = normalizeCursorToolCall(msg.name, msg.args);
9669
9705
  if (msg.status === "running") {
9670
- return [
9706
+ const events = [
9671
9707
  {
9672
9708
  type: "tool_use",
9673
9709
  id: msg.call_id,
@@ -9675,6 +9711,16 @@ function cursorSdkMessageToEvents(msg) {
9675
9711
  input: normalized.input
9676
9712
  }
9677
9713
  ];
9714
+ const live = unwrapCursorToolResult(msg.result);
9715
+ if (live) {
9716
+ events.push({
9717
+ type: "tool_result",
9718
+ id: msg.call_id,
9719
+ content: live,
9720
+ partial: true
9721
+ });
9722
+ }
9723
+ return events;
9678
9724
  }
9679
9725
  if (msg.status === "completed" || msg.status === "error") {
9680
9726
  return [
@@ -10192,13 +10238,16 @@ var init_opencode = __esm({
10192
10238
  );
10193
10239
  const events = [{ type: "tool_use", id, name, input }];
10194
10240
  const output = state?.output;
10195
- if (output != null || state?.status === "completed" || state?.status === "error") {
10241
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
10242
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
10243
+ if (output != null || finished) {
10196
10244
  const content = typeof output === "string" ? output : output != null ? JSON.stringify(output) : formatUnknownDetail(state?.error) || void 0;
10197
10245
  events.push({
10198
10246
  type: "tool_result",
10199
10247
  id,
10200
10248
  content,
10201
- isError: state?.status === "error" || state?.status === "failed"
10249
+ isError: state?.status === "error" || state?.status === "failed",
10250
+ ...running && !finished ? { partial: true } : {}
10202
10251
  });
10203
10252
  }
10204
10253
  return events.length === 1 ? events[0] : events;
@@ -10233,14 +10282,17 @@ var init_opencode = __esm({
10233
10282
  withEventParentId({ type: "tool_use", id, name, input }, parentId)
10234
10283
  ];
10235
10284
  const output = state?.output ?? part.output;
10236
- if (output != null || state?.status === "completed" || state?.status === "error") {
10285
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
10286
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
10287
+ if (output != null || finished) {
10237
10288
  nested.push(
10238
10289
  withEventParentId(
10239
10290
  {
10240
10291
  type: "tool_result",
10241
10292
  id,
10242
10293
  content: typeof output === "string" ? output : output != null ? JSON.stringify(output) : void 0,
10243
- isError: state?.status === "error" || state?.status === "failed"
10294
+ isError: state?.status === "error" || state?.status === "failed",
10295
+ ...running && !finished ? { partial: true } : {}
10244
10296
  },
10245
10297
  parentId
10246
10298
  )
@@ -15214,14 +15266,15 @@ function formatArtifactDirective() {
15214
15266
  return [
15215
15267
  "Sideboard side column (desktop UI):",
15216
15268
  "claude.ai\u2019s \u201CArtifact\u201D tool does NOT exist in Claude Code. That is expected.",
15269
+ "Do not unprompted-duplicate a payload. Chat markdown (including tables) already renders in the transcript \u2014 do not also call present_schema with those same rows just to display them. If the user asks for an editable / interactive table, call present_schema even if markdown already showed the data. Do not also call present_artifact for a document you already fenced in chat.",
15217
15270
  "Documents (HTML/SVG/markdown):",
15218
15271
  "1) Emit a fenced code block tagged `html` (preferred), `svg`, or `markdown` with the FULL document \u2014 Sideboard opens a side column. Example:",
15219
15272
  "```html",
15220
15273
  "<!DOCTYPE html><html><head><title>Demo</title></head><body><h1>Hi</h1></body></html>",
15221
15274
  "```",
15222
- "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content.",
15275
+ "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content \u2014 not both a fence and this tool for the same body.",
15223
15276
  "CMS / JSON Schema forms & tables (Brightsy or any schema+schemaUi source):",
15224
- "3) Call Sideboard MCP `present_schema` with title, mode (table|form), and either:",
15277
+ "3) Call Sideboard MCP `present_schema` when the user needs to filter, edit, publish, or persist rows \u2014 including after you already showed a markdown table, if they then ask for an editable table. If they only need to read the data, a markdown table is enough. When you do call it, pass title, mode (table|form), and either:",
15225
15278
  " - datasource=brightsy + resource_id (record type UUID) after fetching types via Brightsy MCP, or",
15226
15279
  " - datasource=inline + resource: { id, title, schema, schemaUi } and optional records/record.",
15227
15280
  "Files / media browser (CMS file manager column):",
@@ -15230,11 +15283,11 @@ function formatArtifactDirective() {
15230
15283
  "Multiple-choice questions:",
15231
15284
  "5) Call Sideboard MCP `ask_user` only when work is blocked on choosing among a few concrete options (approach forks, which API, auth vs cookies). First write a short chat message that explains the decision and what each option means (tradeoffs, when to pick it). Include a description on every option. After calling, stop and wait for their next message with answers. If you are asking a real multiple-choice, use ask_user rather than chat bullets so Sideboard shows the composer picker.",
15232
15285
  "Do not call ask_user for greetings, check-ins, \u201Chello\u201D, open-ended how-can-I-help, or to invent a menu of possible next tasks \u2014 reply in chat. If one option is the obvious default, proceed without asking.",
15233
- "Never say artifacts, CMS UI, or the Files column are unavailable. Prefer present_schema for list/edit/publish; present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
15286
+ "Never say artifacts, CMS UI, or the Files column are unavailable. present_schema is for interactive list/edit/publish (use it when they ask to edit, even if chat already had a markdown table); present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
15234
15287
  ].join("\n");
15235
15288
  }
15236
15289
  function formatUiReminder() {
15237
- return "Sideboard UI: html fence or present_artifact / present_schema / present_files; ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
15290
+ 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. ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
15238
15291
  }
15239
15292
  function loadAgentInstructions(worktreePath, agent) {
15240
15293
  const candidates = FILES_BY_AGENT[agent] ?? FILES_BY_AGENT.claude;
@@ -17873,6 +17926,7 @@ __export(index_exports, {
17873
17926
  isPresentPlanToolName: () => isPresentPlanToolName,
17874
17927
  isPrimaryCheckoutThread: () => isPrimaryCheckoutThread,
17875
17928
  isSessionQuotaLimit: () => isSessionQuotaLimit,
17929
+ isShellToolName: () => isShellToolName,
17876
17930
  isSideboardScratchPath: () => isSideboardScratchPath,
17877
17931
  isSlackCoordinatorThread: () => isSlackCoordinatorThread,
17878
17932
  isSlackExternalReplyPrompt: () => isSlackExternalReplyPrompt,
@@ -20022,7 +20076,7 @@ async function startMcpServer() {
20022
20076
  }
20023
20077
  server.tool(
20024
20078
  "present_artifact",
20025
- "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
20079
+ "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Do not also emit the same document as a chat html/markdown fence. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
20026
20080
  {
20027
20081
  title: import_zod4.z.string().describe("Short title shown in the artifact pane header"),
20028
20082
  type: import_zod4.z.enum(["html", "svg", "markdown", "react"]).describe(
@@ -20099,7 +20153,7 @@ async function startMcpServer() {
20099
20153
  );
20100
20154
  server.tool(
20101
20155
  "present_schema",
20102
- "Open Sideboard\u2019s schema-driven side column (filterable table and/or form). Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
20156
+ "Open Sideboard\u2019s schema-driven side column (filterable table and/or form) when the user needs to filter, edit, publish, or persist records. Do not call this just to re-display rows you already wrote as a markdown table. If the user asks for an editable / interactive table, call this even if chat already showed those rows. Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
20103
20157
  {
20104
20158
  title: import_zod4.z.string().describe("Pane title"),
20105
20159
  mode: import_zod4.z.enum(["table", "form"]).optional().describe("table = list/filter records; form = edit one record"),
@@ -23629,6 +23683,7 @@ init_outbound_watch();
23629
23683
  isPresentPlanToolName,
23630
23684
  isPrimaryCheckoutThread,
23631
23685
  isSessionQuotaLimit,
23686
+ isShellToolName,
23632
23687
  isSideboardScratchPath,
23633
23688
  isSlackCoordinatorThread,
23634
23689
  isSlackExternalReplyPrompt,
package/dist/index.d.cts CHANGED
@@ -441,6 +441,11 @@ type AgentEvent = {
441
441
  content?: string;
442
442
  isError?: boolean;
443
443
  parentId?: string;
444
+ /**
445
+ * Update `result` without finishing the tool (live command tail).
446
+ * Codex `command_execution.aggregated_output` while in progress.
447
+ */
448
+ partial?: boolean;
444
449
  } | {
445
450
  type: 'usage';
446
451
  data: TokenUsage;
@@ -2213,6 +2218,7 @@ declare function toolDescription(name: string, input?: Record<string, unknown>):
2213
2218
  declare function isSubagentToolName(name: string | undefined): boolean;
2214
2219
  /** Bash/Agent poll wrappers — not the interesting work the user wants to see. */
2215
2220
  declare function isPollWrapperToolName(name: string | undefined): boolean;
2221
+ declare function isShellToolName(name: string | undefined): boolean;
2216
2222
  /**
2217
2223
  * Cursor-style footer for a finished (or in-flight) turn: “Edited foo.ts, 1 search, ran 2 commands”.
2218
2224
  */
@@ -4744,4 +4750,4 @@ interface SlackRelayClientOptions {
4744
4750
  */
4745
4751
  declare function runSlackRelayClient(opts: SlackRelayClientOptions): Promise<void>;
4746
4752
 
4747
- export { AGENT_GIT_ACTIONS, AGENT_RUNNER_MAX_OLD_SPACE_MB, ATTACHMENTS_DIR, type ActiveRun, type AddStackLayerInput, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentGitAction, type AgentInstructionFile, type AgentKind, type AgentModelCatalog, type AgentModelInfo, type AgentSetupActionResult, type AgentSetupInfo, type AgentSetupKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BAKED_SLACK_RELAY_URL, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CLAUDE_MODEL_CATALOG, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, CONVENTION_SETUP_RELPATHS, COORDINATOR_TOOL_PLAYBOOK, type CaffeinateHoldState, type ClaudeHarnessSettings, type CleanupOrphansResult, type CliAgentKind, type CliExecutableSettings, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ComposerFileBuffer, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type ConventionSetupFile, type CowboyThreadFields, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateScheduledTaskInput, type CreateStackInput, type CreateThreadInput, type CreateWorktreeResult, type CursorModelInfo, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DefaultsAppSettings, type DevServerHandle, type DiffCommentInput, type DiffCommentLine, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GITHUB_GIT_AUTH_MODES, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GhStackStatus, type GitHubStatus, type GitWorktreeStatus, type GithubGitAuthMode, HARNESS_ENV_KEYS, type HarnessId, type InitStackFromThreadInput, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, LEGACY_ATTACHMENTS_DIR, LEGACY_PLAN_FILE_REL, LEGACY_REVIEW_REQUEST_PATH, LINEAR_OAUTH_CANCELLED, LINEAR_OAUTH_PORT, LINEAR_OAUTH_REDIRECT, LINEAR_OAUTH_SCOPES, type LandPreview, type LandResult, type LinearComment, type LinearIssue, LinearOAuthCancelledError, type LinearTeam, type LinearTeamsResult, type LinearWorkflowState, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, ORCHESTRATOR_AGENT_KINDS, type OpenPrStackLayersInput, type OpenStackLayerInput, type OpenStackLayerResult, type OrchestrationQuotaOnLimit, Orchestrator, type OrchestratorAgentKind, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PASTE_ATTACH_MIN_CHARS, PASTE_ATTACH_MIN_LINES, PLAN_FILE_NAME, PLAN_FILE_REL, PLAN_MODE_INSTRUCTION, type PendingPlanQuestions, type PlanQuestion, type PlanQuestionAnswer, type PlanQuestionOption, type PlanToolPartLike, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type PrStack, type PrStackLayer, type PresentedPlan, type PublicAppSettings, type PublicIntegrationsSettings, REPO_REVIEW_NAME, REPO_REVIEW_PATH, REVIEW_REQUEST_NAME, REVIEW_REQUEST_PATH, REVIEW_REQUEST_PREFILL, REVIEW_REQUEST_TEMPLATE, REVIEW_SKILL_NAME, REVIEW_SKILL_PATH, type RepoSettings, type RepoSetupInfo, type RequestReviewResult, type ResolvedReviewGuidelines, type ReviewGuidelinesSource, type RunMode, type RunScript, SESSION_RESET_OCCUPANCY_TOKENS, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, SIDEBOARD_MCP_PROFILE_ENV, SLACK_LISTEN_STOPPED_REPLY, SLACK_LISTEN_TIMEOUT_REPLY, SLACK_OAUTH_CANCELLED, SLACK_OAUTH_REDIRECT, SLACK_PROGRESS_DELAY_MS, SLACK_PROGRESS_EDIT_MS, SLACK_REPLY_FORMATTING, SLACK_SEEN_REACTION, type ScheduleCreatedBy, type ScheduleWhen, type ScheduledTask, type ScriptHandle, type SetupRunResult, type SideboardMcpProfile, type SkillInfo, type SlackInboundMessage, type SlackListenOptions, type SlackListenStatus, SlackOAuthCancelledError, type SlackOutboundReply, type SlackOutboundWatch, type SlackRelayClientMessage, type SlackRelayClientOptions, SlackRelayHub, type SlackRelayServerHandle, type SlackRelayServerMessage, type SlackRelayServerOptions, type SlackReplyBadge, type SlackWorkspaceInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, THINKING_EFFORTS, type TeamName, type ThinkingEffort, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type ToolPartLike, type TranscriptToolDetail, type TurnCommand, type UpdateScheduledTaskPatch, type UsageScope, WORKTREE_MCP_TOOLS, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, ackSlackInboundSeen, addPrStackLayer, addStackLayerFromThread, addWorkspace, adoptThread, agentGitPrompt, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendIndexedGitConfig, appendMessage, applyAgentEvent, applyAgentRunnerHeapEnv, applyAppEnvironment, applyCompaction, applyGithubGitAuthEnv, applyPromptCacheTtlEnv, applyThreadIntoMain, applyTurnUsage, armSchedules, assertOrchestratorCapableAgent, attachmentFromAbsolutePath, attachmentsFromBuffers, attachmentsFromWorktreePaths, attachmentsGitignoreBody, autoArchiveOnMergeEnabled, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyInjectWorktreeMcpEnabled, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildDiffCommentAttachment, buildForkTranscriptAttachment, buildPastedTextAttachment, buildReviewRequestAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateHoldPath, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, caffeinateWhileSchedulesEnabled, caffeinateWhileSlackListenEnabled, captureLoginEnv, captureTurnBaseline, checkoutPrStackLayer, childEnvWithAppSettings, claimDesktopHost, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, codexSandboxWritableRootsArgs, codexUnattendedGitConfigArgs, coerceOrchestratorAgent, collectTakenTeamSlugs, commentLinearIssue, commitAll, computeNextRunAt, conductorBundledBinDir, conductorDbPath, confirmLand, connectBrightsyTeam, connectSlackToken, contextTokens, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, cowboyModeEnabled, createChatTab, createEmptyThread, createExistingBranchWorktree, createGlobalChat, createLinearIssue, createLinearPkce, createOrUpdatePr, createPrStack, createSchedule, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, defaultScheduleName, deleteBranchOnPurgeEnabled, deleteSchedule, deleteThreadRecord, desktopHostPidPath, detectAgents, detectGhStack, detectLocalMergeConflicts, disconnectBrightsyTeam, disconnectLinear, disconnectLinearConnection, disconnectSlackWorkspace, discoverSkills, dismissSlackReplyBadge, dropCachedPrefixOnResume, encodeBrightsyTarget, enrichPathWithNpmGlobalBin, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGhPreferOrigin, ensureGlobalCoordinatorCwd, ensureReviewRequestFile, ensureReviewSkillFile, ensureSlackCoordinator, ensureSlackDeviceIdentity, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractGhErrorDetail, extractPendingPlanQuestions, extractPresentedPlan, extractiveSummary, fetchPrHead, finalizeParts, findConventionSetup, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findSlackCoordinator, findThreadByRef, findThreadForStackLayer, fireSchedule, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatArtifactDirective, formatBrightsyFetchError, formatFetchError, formatGhLandError, formatGitAuthModeDirective, formatIpcInvokeError, formatMergePrError, formatMessagesAsTranscript, formatPlanQuestionAnswers, formatPlanQuestionsForChat, formatProcessGuideDirective, formatRateLimitResetHint, formatRenameBranchDirective, formatScheduleWhen, formatScheduledPrompt, formatSlackExternalReplyPrompt, formatSlackInboundPrompt, formatSlackRepliesForTurn, formatSlackSignedReply, formatSlackWorkingText, formatTranscriptMarkdown, formatUiReminder, formatWorkspaceInventory, formatWorktreeDirective, formatWorktreeReminder, fromInclusiveInputUsage, getAdapter, getAgentSetupInfo, getBrightsySession, getCaffeinateHold, getDefaultAgent, getDefaultEffort, getDefaultFast, getDefaultModel, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getGithubGitAuthMode, getGithubPat, getIssueSource, getLinearApiKey, getLinearAuthToken, getLinearIssue, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrForHeadBranch, getPrMeta, getPrStack, getRepoSetupInfo, getRunMode, getRunScript, getSchedule, getSlackWorkspace, gh, ghHeadRef, ghRepoSelectArgs, git, githubAgentGitEnv, globalAgentCwd, handleSlackInbound, harnessEnvKey, hasBakedLinearOAuth, hasBakedSlackOAuth, hasConductorHook, hasConventionSetup, hasCursorWorktreeSetup, hasEnabledSchedules, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, httpFetch, importConductorWorkspace, importConductorWorkspaceAsync, initPrStack, initStackFromThread, initializeGitRepository, inspectGitWorktree, installAgent, interruptSlackCoordinatorForInbound, isAskUserToolName, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isConductorBundledCli, isCowboyThread, isCursorAutoModel, isDefaultishSourceRef, isDesktopHostAlive, isDirty, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isImageFilePath, isInPrStack, isInboundForThisDesktop, isLinearConnected, isLinearOAuthCancelled, isOrchestratorCapableAgent, isOrchestratorThread, isPidAlive, isPlaceholderBranch, isPollWrapperToolName, isPrNotMergeableError, isPresentPlanToolName, isPrimaryCheckoutThread, isSessionQuotaLimit, isSideboardScratchPath, isSlackCoordinatorThread, isSlackExternalReplyPrompt, isSlackOAuthCancelled, isSubagentToolName, isThinkingEffort, isThisProcessDesktopHost, isThreadCaffeinated, isWorkspaceScratchPath, lastRequestOccupancy, linearAuthorizationHeader, linearGraphql, linearOAuthAuthorizeUrl, linearOAuthCredentials, listAgentSetupInfo, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listCodexModels, listConductorWorkspaces, listConnectedBrightsyTeams, listCursorModels, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listLinearTeams, listModelsForAgent, listOpencodeModels, listPrs, listRunScripts, listSchedules, listSlackOutboundWatches, listSlackReplyBadges, listSlackWorkspaces, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, liveActivitySummary, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, loginAgent, lookupSoccerTeam, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergeAgentGitAuthEnv, mergePr, mergePrStack, mergeSideboardIntoMcpServersJson, mergeUsage, messagePartParentId, nextPastedTextName, nextThinkingEffort, nonInteractiveGitProcessEnv, normalizeParseResult, normalizeThinkingEffort, normalizeThread, normalizeTurnInput, normalizeWorktreePath, openInSystemTerminal, openPrStackLayers, openStackLayer, opencodeAdapter, orchestrationQuotaFallbackAgent, orchestrationQuotaOnLimit, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, originGhRepoEnv, parseCursorRunnerLine, parseDurationMs, parseForceStopMessage, parseGhStackViewJson, parseGithubSlugFromRemoteUrl, parseMcpList, parsePlanQuestionsInput, parseSessionQuotaResetAt, parseSlackRelayClientMessage, parseSlackRelayServerMessage, partsToAssistantText, pastedTextStats, pendingSlackExternalReplies, permalinkForSlackReplyBadge, permissionMode, persistVaultKeyInKeychain, planFileAbs, posixShellSingleQuote, prepareTerminalCommand, previewLand, promptMentionsBrightsy, pushBranch, readExistingReviewRequestFile, readKeychainVaultKey, readPlanFile, readSkillBody, readThread, readWorktreeFile, readWorktreeFileForUpload, readWorktreeInclude, recordScheduleRun, recordSlackOutboundWatch, refreshGitHubAuth, refreshSlackReplyBadges, registerPackagedUserMcpClients, releaseCaffeinateHoldForThread, releaseDesktopHost, removeWorkspace, removeWorktree, repoSlug, requestOccupancy, requestReview, requireAgent, resetGhStackDetectCache, resetGithubAgentTokenMemo, resolveAgentExecutable, resolveAgentGitAuthEnv, resolveClaudeExecutable, resolveCodexGitWritableRoots, resolveCommandBinarySync, resolveConductorCursorAgentId, resolveCursorModelId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGhAuthToken, resolveGitDirsForLockRecovery, resolveGithubAgentToken, resolveGithubRepoSlug, resolveLinearState, resolveLinearTeam, resolveLoginCommand, resolveNewThreadOptions, resolvePlanMarkdown, resolvePrSelector, resolvePrSelectors, resolveQuotaFallbackAgent, resolveRepoRoot, resolveReviewGuidelines, resolveScheduleThreadId, resolveSlackListenMode, resolveThreadDefaults, resolveThreadEffort, resolveVaultKey, resolveWorktreeStartPoint, rewriteLinearError, run, runArchiveScript, runCloudConnect, runConventionSetup, runCursorWorktreeSetup, runSetupScript, runSlackListen, runSlackRelayClient, runWorkspaceSetup, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, saveLinearOAuth, schedulesPath, scrubGithubTokensFromChildEnv, secureFileUnlocksWith, setCaffeinateHold, setHttpFetchImpl, setStatus, setVaultMasterKey, settingsSourceLabel, shouldAttachPastedText, shouldCompactContext, shouldInjectBrightsyMcp, shouldRefreshReviewRequestTemplate, shouldRemoveWorktreeOnTeardown, shouldResetSessionForOccupancy, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardMcpProfile, sideboardReposDir, sideboardWorkspacesDir, slackAppLevelToken, slackArchiveUrl, slackCoordinatorSourceRef, slackListenEnabled, slackOAuthCredentials, slackOAuthResultUrl, slackRelayUrl, slugify, spawnAgentTurn, splitForCompaction, stackAgentDefaultsFrom, stackIdFrom, stackMergeReadiness, stageAbsolutePathsAsAttachments, stageBuffersAsAttachments, startDevServer, startLinearOAuth, startMcpServer, startOrchestration, startSlackOAuth, startSlackRelayServer, stripBrightsyNdjsonNoise, stripNestedElectronEnv, submitPrStack, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, thinkingEffortBars, thinkingEffortLabel, thisProcessShouldDrainAgentQueues, threadDisplayLabel, threadFilePath, threadLivePath, threadLockPath, threadRequestsBrightsyMcp, threadsDir, threadsSharingWorktree, toPublicAppSettings, toolActivityLine, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAgentExecutable, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateCodexSettings, updateDefaultsSettings, updateIntegrationsSettings, updateLinearIssue, updateOpencodeSettings, updateSchedule, updateThread, userClaudeMcpConfigPath, userCursorMcpConfigPath, validateLinearApiKey, waitForPidExit, warmGithubAgentAuth, withAgentInstructions, withEventParentId, withEventsParentId, withExportedPath, withMaxOldSpaceSize, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, wrapReviewSkillMarkdown, writeInjectedMcpConfig, writePlanFile, writeThread, writeWorktreeFile };
4753
+ export { AGENT_GIT_ACTIONS, AGENT_RUNNER_MAX_OLD_SPACE_MB, ATTACHMENTS_DIR, type ActiveRun, type AddStackLayerInput, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentGitAction, type AgentInstructionFile, type AgentKind, type AgentModelCatalog, type AgentModelInfo, type AgentSetupActionResult, type AgentSetupInfo, type AgentSetupKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BAKED_SLACK_RELAY_URL, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CLAUDE_MODEL_CATALOG, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, CONVENTION_SETUP_RELPATHS, COORDINATOR_TOOL_PLAYBOOK, type CaffeinateHoldState, type ClaudeHarnessSettings, type CleanupOrphansResult, type CliAgentKind, type CliExecutableSettings, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ComposerFileBuffer, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type ConventionSetupFile, type CowboyThreadFields, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateScheduledTaskInput, type CreateStackInput, type CreateThreadInput, type CreateWorktreeResult, type CursorModelInfo, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DefaultsAppSettings, type DevServerHandle, type DiffCommentInput, type DiffCommentLine, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GITHUB_GIT_AUTH_MODES, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GhStackStatus, type GitHubStatus, type GitWorktreeStatus, type GithubGitAuthMode, HARNESS_ENV_KEYS, type HarnessId, type InitStackFromThreadInput, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, LEGACY_ATTACHMENTS_DIR, LEGACY_PLAN_FILE_REL, LEGACY_REVIEW_REQUEST_PATH, LINEAR_OAUTH_CANCELLED, LINEAR_OAUTH_PORT, LINEAR_OAUTH_REDIRECT, LINEAR_OAUTH_SCOPES, type LandPreview, type LandResult, type LinearComment, type LinearIssue, LinearOAuthCancelledError, type LinearTeam, type LinearTeamsResult, type LinearWorkflowState, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, ORCHESTRATOR_AGENT_KINDS, type OpenPrStackLayersInput, type OpenStackLayerInput, type OpenStackLayerResult, type OrchestrationQuotaOnLimit, Orchestrator, type OrchestratorAgentKind, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PASTE_ATTACH_MIN_CHARS, PASTE_ATTACH_MIN_LINES, PLAN_FILE_NAME, PLAN_FILE_REL, PLAN_MODE_INSTRUCTION, type PendingPlanQuestions, type PlanQuestion, type PlanQuestionAnswer, type PlanQuestionOption, type PlanToolPartLike, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type PrStack, type PrStackLayer, type PresentedPlan, type PublicAppSettings, type PublicIntegrationsSettings, REPO_REVIEW_NAME, REPO_REVIEW_PATH, REVIEW_REQUEST_NAME, REVIEW_REQUEST_PATH, REVIEW_REQUEST_PREFILL, REVIEW_REQUEST_TEMPLATE, REVIEW_SKILL_NAME, REVIEW_SKILL_PATH, type RepoSettings, type RepoSetupInfo, type RequestReviewResult, type ResolvedReviewGuidelines, type ReviewGuidelinesSource, type RunMode, type RunScript, SESSION_RESET_OCCUPANCY_TOKENS, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, SIDEBOARD_MCP_PROFILE_ENV, SLACK_LISTEN_STOPPED_REPLY, SLACK_LISTEN_TIMEOUT_REPLY, SLACK_OAUTH_CANCELLED, SLACK_OAUTH_REDIRECT, SLACK_PROGRESS_DELAY_MS, SLACK_PROGRESS_EDIT_MS, SLACK_REPLY_FORMATTING, SLACK_SEEN_REACTION, type ScheduleCreatedBy, type ScheduleWhen, type ScheduledTask, type ScriptHandle, type SetupRunResult, type SideboardMcpProfile, type SkillInfo, type SlackInboundMessage, type SlackListenOptions, type SlackListenStatus, SlackOAuthCancelledError, type SlackOutboundReply, type SlackOutboundWatch, type SlackRelayClientMessage, type SlackRelayClientOptions, SlackRelayHub, type SlackRelayServerHandle, type SlackRelayServerMessage, type SlackRelayServerOptions, type SlackReplyBadge, type SlackWorkspaceInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, THINKING_EFFORTS, type TeamName, type ThinkingEffort, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type ToolPartLike, type TranscriptToolDetail, type TurnCommand, type UpdateScheduledTaskPatch, type UsageScope, WORKTREE_MCP_TOOLS, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, ackSlackInboundSeen, addPrStackLayer, addStackLayerFromThread, addWorkspace, adoptThread, agentGitPrompt, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendIndexedGitConfig, appendMessage, applyAgentEvent, applyAgentRunnerHeapEnv, applyAppEnvironment, applyCompaction, applyGithubGitAuthEnv, applyPromptCacheTtlEnv, applyThreadIntoMain, applyTurnUsage, armSchedules, assertOrchestratorCapableAgent, attachmentFromAbsolutePath, attachmentsFromBuffers, attachmentsFromWorktreePaths, attachmentsGitignoreBody, autoArchiveOnMergeEnabled, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyInjectWorktreeMcpEnabled, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildDiffCommentAttachment, buildForkTranscriptAttachment, buildPastedTextAttachment, buildReviewRequestAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateHoldPath, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, caffeinateWhileSchedulesEnabled, caffeinateWhileSlackListenEnabled, captureLoginEnv, captureTurnBaseline, checkoutPrStackLayer, childEnvWithAppSettings, claimDesktopHost, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, codexSandboxWritableRootsArgs, codexUnattendedGitConfigArgs, coerceOrchestratorAgent, collectTakenTeamSlugs, commentLinearIssue, commitAll, computeNextRunAt, conductorBundledBinDir, conductorDbPath, confirmLand, connectBrightsyTeam, connectSlackToken, contextTokens, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, cowboyModeEnabled, createChatTab, createEmptyThread, createExistingBranchWorktree, createGlobalChat, createLinearIssue, createLinearPkce, createOrUpdatePr, createPrStack, createSchedule, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, defaultScheduleName, deleteBranchOnPurgeEnabled, deleteSchedule, deleteThreadRecord, desktopHostPidPath, detectAgents, detectGhStack, detectLocalMergeConflicts, disconnectBrightsyTeam, disconnectLinear, disconnectLinearConnection, disconnectSlackWorkspace, discoverSkills, dismissSlackReplyBadge, dropCachedPrefixOnResume, encodeBrightsyTarget, enrichPathWithNpmGlobalBin, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGhPreferOrigin, ensureGlobalCoordinatorCwd, ensureReviewRequestFile, ensureReviewSkillFile, ensureSlackCoordinator, ensureSlackDeviceIdentity, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractGhErrorDetail, extractPendingPlanQuestions, extractPresentedPlan, extractiveSummary, fetchPrHead, finalizeParts, findConventionSetup, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findSlackCoordinator, findThreadByRef, findThreadForStackLayer, fireSchedule, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatArtifactDirective, formatBrightsyFetchError, formatFetchError, formatGhLandError, formatGitAuthModeDirective, formatIpcInvokeError, formatMergePrError, formatMessagesAsTranscript, formatPlanQuestionAnswers, formatPlanQuestionsForChat, formatProcessGuideDirective, formatRateLimitResetHint, formatRenameBranchDirective, formatScheduleWhen, formatScheduledPrompt, formatSlackExternalReplyPrompt, formatSlackInboundPrompt, formatSlackRepliesForTurn, formatSlackSignedReply, formatSlackWorkingText, formatTranscriptMarkdown, formatUiReminder, formatWorkspaceInventory, formatWorktreeDirective, formatWorktreeReminder, fromInclusiveInputUsage, getAdapter, getAgentSetupInfo, getBrightsySession, getCaffeinateHold, getDefaultAgent, getDefaultEffort, getDefaultFast, getDefaultModel, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getGithubGitAuthMode, getGithubPat, getIssueSource, getLinearApiKey, getLinearAuthToken, getLinearIssue, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrForHeadBranch, getPrMeta, getPrStack, getRepoSetupInfo, getRunMode, getRunScript, getSchedule, getSlackWorkspace, gh, ghHeadRef, ghRepoSelectArgs, git, githubAgentGitEnv, globalAgentCwd, handleSlackInbound, harnessEnvKey, hasBakedLinearOAuth, hasBakedSlackOAuth, hasConductorHook, hasConventionSetup, hasCursorWorktreeSetup, hasEnabledSchedules, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, httpFetch, importConductorWorkspace, importConductorWorkspaceAsync, initPrStack, initStackFromThread, initializeGitRepository, inspectGitWorktree, installAgent, interruptSlackCoordinatorForInbound, isAskUserToolName, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isConductorBundledCli, isCowboyThread, isCursorAutoModel, isDefaultishSourceRef, isDesktopHostAlive, isDirty, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isImageFilePath, isInPrStack, isInboundForThisDesktop, isLinearConnected, isLinearOAuthCancelled, isOrchestratorCapableAgent, isOrchestratorThread, isPidAlive, isPlaceholderBranch, isPollWrapperToolName, isPrNotMergeableError, isPresentPlanToolName, isPrimaryCheckoutThread, isSessionQuotaLimit, isShellToolName, isSideboardScratchPath, isSlackCoordinatorThread, isSlackExternalReplyPrompt, isSlackOAuthCancelled, isSubagentToolName, isThinkingEffort, isThisProcessDesktopHost, isThreadCaffeinated, isWorkspaceScratchPath, lastRequestOccupancy, linearAuthorizationHeader, linearGraphql, linearOAuthAuthorizeUrl, linearOAuthCredentials, listAgentSetupInfo, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listCodexModels, listConductorWorkspaces, listConnectedBrightsyTeams, listCursorModels, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listLinearTeams, listModelsForAgent, listOpencodeModels, listPrs, listRunScripts, listSchedules, listSlackOutboundWatches, listSlackReplyBadges, listSlackWorkspaces, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, liveActivitySummary, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, loginAgent, lookupSoccerTeam, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergeAgentGitAuthEnv, mergePr, mergePrStack, mergeSideboardIntoMcpServersJson, mergeUsage, messagePartParentId, nextPastedTextName, nextThinkingEffort, nonInteractiveGitProcessEnv, normalizeParseResult, normalizeThinkingEffort, normalizeThread, normalizeTurnInput, normalizeWorktreePath, openInSystemTerminal, openPrStackLayers, openStackLayer, opencodeAdapter, orchestrationQuotaFallbackAgent, orchestrationQuotaOnLimit, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, originGhRepoEnv, parseCursorRunnerLine, parseDurationMs, parseForceStopMessage, parseGhStackViewJson, parseGithubSlugFromRemoteUrl, parseMcpList, parsePlanQuestionsInput, parseSessionQuotaResetAt, parseSlackRelayClientMessage, parseSlackRelayServerMessage, partsToAssistantText, pastedTextStats, pendingSlackExternalReplies, permalinkForSlackReplyBadge, permissionMode, persistVaultKeyInKeychain, planFileAbs, posixShellSingleQuote, prepareTerminalCommand, previewLand, promptMentionsBrightsy, pushBranch, readExistingReviewRequestFile, readKeychainVaultKey, readPlanFile, readSkillBody, readThread, readWorktreeFile, readWorktreeFileForUpload, readWorktreeInclude, recordScheduleRun, recordSlackOutboundWatch, refreshGitHubAuth, refreshSlackReplyBadges, registerPackagedUserMcpClients, releaseCaffeinateHoldForThread, releaseDesktopHost, removeWorkspace, removeWorktree, repoSlug, requestOccupancy, requestReview, requireAgent, resetGhStackDetectCache, resetGithubAgentTokenMemo, resolveAgentExecutable, resolveAgentGitAuthEnv, resolveClaudeExecutable, resolveCodexGitWritableRoots, resolveCommandBinarySync, resolveConductorCursorAgentId, resolveCursorModelId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGhAuthToken, resolveGitDirsForLockRecovery, resolveGithubAgentToken, resolveGithubRepoSlug, resolveLinearState, resolveLinearTeam, resolveLoginCommand, resolveNewThreadOptions, resolvePlanMarkdown, resolvePrSelector, resolvePrSelectors, resolveQuotaFallbackAgent, resolveRepoRoot, resolveReviewGuidelines, resolveScheduleThreadId, resolveSlackListenMode, resolveThreadDefaults, resolveThreadEffort, resolveVaultKey, resolveWorktreeStartPoint, rewriteLinearError, run, runArchiveScript, runCloudConnect, runConventionSetup, runCursorWorktreeSetup, runSetupScript, runSlackListen, runSlackRelayClient, runWorkspaceSetup, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, saveLinearOAuth, schedulesPath, scrubGithubTokensFromChildEnv, secureFileUnlocksWith, setCaffeinateHold, setHttpFetchImpl, setStatus, setVaultMasterKey, settingsSourceLabel, shouldAttachPastedText, shouldCompactContext, shouldInjectBrightsyMcp, shouldRefreshReviewRequestTemplate, shouldRemoveWorktreeOnTeardown, shouldResetSessionForOccupancy, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardMcpProfile, sideboardReposDir, sideboardWorkspacesDir, slackAppLevelToken, slackArchiveUrl, slackCoordinatorSourceRef, slackListenEnabled, slackOAuthCredentials, slackOAuthResultUrl, slackRelayUrl, slugify, spawnAgentTurn, splitForCompaction, stackAgentDefaultsFrom, stackIdFrom, stackMergeReadiness, stageAbsolutePathsAsAttachments, stageBuffersAsAttachments, startDevServer, startLinearOAuth, startMcpServer, startOrchestration, startSlackOAuth, startSlackRelayServer, stripBrightsyNdjsonNoise, stripNestedElectronEnv, submitPrStack, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, thinkingEffortBars, thinkingEffortLabel, thisProcessShouldDrainAgentQueues, threadDisplayLabel, threadFilePath, threadLivePath, threadLockPath, threadRequestsBrightsyMcp, threadsDir, threadsSharingWorktree, toPublicAppSettings, toolActivityLine, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAgentExecutable, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateCodexSettings, updateDefaultsSettings, updateIntegrationsSettings, updateLinearIssue, updateOpencodeSettings, updateSchedule, updateThread, userClaudeMcpConfigPath, userCursorMcpConfigPath, validateLinearApiKey, waitForPidExit, warmGithubAgentAuth, withAgentInstructions, withEventParentId, withEventsParentId, withExportedPath, withMaxOldSpaceSize, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, wrapReviewSkillMarkdown, writeInjectedMcpConfig, writePlanFile, writeThread, writeWorktreeFile };
package/dist/index.d.ts CHANGED
@@ -441,6 +441,11 @@ type AgentEvent = {
441
441
  content?: string;
442
442
  isError?: boolean;
443
443
  parentId?: string;
444
+ /**
445
+ * Update `result` without finishing the tool (live command tail).
446
+ * Codex `command_execution.aggregated_output` while in progress.
447
+ */
448
+ partial?: boolean;
444
449
  } | {
445
450
  type: 'usage';
446
451
  data: TokenUsage;
@@ -2213,6 +2218,7 @@ declare function toolDescription(name: string, input?: Record<string, unknown>):
2213
2218
  declare function isSubagentToolName(name: string | undefined): boolean;
2214
2219
  /** Bash/Agent poll wrappers — not the interesting work the user wants to see. */
2215
2220
  declare function isPollWrapperToolName(name: string | undefined): boolean;
2221
+ declare function isShellToolName(name: string | undefined): boolean;
2216
2222
  /**
2217
2223
  * Cursor-style footer for a finished (or in-flight) turn: “Edited foo.ts, 1 search, ran 2 commands”.
2218
2224
  */
@@ -4744,4 +4750,4 @@ interface SlackRelayClientOptions {
4744
4750
  */
4745
4751
  declare function runSlackRelayClient(opts: SlackRelayClientOptions): Promise<void>;
4746
4752
 
4747
- export { AGENT_GIT_ACTIONS, AGENT_RUNNER_MAX_OLD_SPACE_MB, ATTACHMENTS_DIR, type ActiveRun, type AddStackLayerInput, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentGitAction, type AgentInstructionFile, type AgentKind, type AgentModelCatalog, type AgentModelInfo, type AgentSetupActionResult, type AgentSetupInfo, type AgentSetupKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BAKED_SLACK_RELAY_URL, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CLAUDE_MODEL_CATALOG, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, CONVENTION_SETUP_RELPATHS, COORDINATOR_TOOL_PLAYBOOK, type CaffeinateHoldState, type ClaudeHarnessSettings, type CleanupOrphansResult, type CliAgentKind, type CliExecutableSettings, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ComposerFileBuffer, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type ConventionSetupFile, type CowboyThreadFields, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateScheduledTaskInput, type CreateStackInput, type CreateThreadInput, type CreateWorktreeResult, type CursorModelInfo, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DefaultsAppSettings, type DevServerHandle, type DiffCommentInput, type DiffCommentLine, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GITHUB_GIT_AUTH_MODES, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GhStackStatus, type GitHubStatus, type GitWorktreeStatus, type GithubGitAuthMode, HARNESS_ENV_KEYS, type HarnessId, type InitStackFromThreadInput, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, LEGACY_ATTACHMENTS_DIR, LEGACY_PLAN_FILE_REL, LEGACY_REVIEW_REQUEST_PATH, LINEAR_OAUTH_CANCELLED, LINEAR_OAUTH_PORT, LINEAR_OAUTH_REDIRECT, LINEAR_OAUTH_SCOPES, type LandPreview, type LandResult, type LinearComment, type LinearIssue, LinearOAuthCancelledError, type LinearTeam, type LinearTeamsResult, type LinearWorkflowState, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, ORCHESTRATOR_AGENT_KINDS, type OpenPrStackLayersInput, type OpenStackLayerInput, type OpenStackLayerResult, type OrchestrationQuotaOnLimit, Orchestrator, type OrchestratorAgentKind, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PASTE_ATTACH_MIN_CHARS, PASTE_ATTACH_MIN_LINES, PLAN_FILE_NAME, PLAN_FILE_REL, PLAN_MODE_INSTRUCTION, type PendingPlanQuestions, type PlanQuestion, type PlanQuestionAnswer, type PlanQuestionOption, type PlanToolPartLike, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type PrStack, type PrStackLayer, type PresentedPlan, type PublicAppSettings, type PublicIntegrationsSettings, REPO_REVIEW_NAME, REPO_REVIEW_PATH, REVIEW_REQUEST_NAME, REVIEW_REQUEST_PATH, REVIEW_REQUEST_PREFILL, REVIEW_REQUEST_TEMPLATE, REVIEW_SKILL_NAME, REVIEW_SKILL_PATH, type RepoSettings, type RepoSetupInfo, type RequestReviewResult, type ResolvedReviewGuidelines, type ReviewGuidelinesSource, type RunMode, type RunScript, SESSION_RESET_OCCUPANCY_TOKENS, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, SIDEBOARD_MCP_PROFILE_ENV, SLACK_LISTEN_STOPPED_REPLY, SLACK_LISTEN_TIMEOUT_REPLY, SLACK_OAUTH_CANCELLED, SLACK_OAUTH_REDIRECT, SLACK_PROGRESS_DELAY_MS, SLACK_PROGRESS_EDIT_MS, SLACK_REPLY_FORMATTING, SLACK_SEEN_REACTION, type ScheduleCreatedBy, type ScheduleWhen, type ScheduledTask, type ScriptHandle, type SetupRunResult, type SideboardMcpProfile, type SkillInfo, type SlackInboundMessage, type SlackListenOptions, type SlackListenStatus, SlackOAuthCancelledError, type SlackOutboundReply, type SlackOutboundWatch, type SlackRelayClientMessage, type SlackRelayClientOptions, SlackRelayHub, type SlackRelayServerHandle, type SlackRelayServerMessage, type SlackRelayServerOptions, type SlackReplyBadge, type SlackWorkspaceInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, THINKING_EFFORTS, type TeamName, type ThinkingEffort, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type ToolPartLike, type TranscriptToolDetail, type TurnCommand, type UpdateScheduledTaskPatch, type UsageScope, WORKTREE_MCP_TOOLS, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, ackSlackInboundSeen, addPrStackLayer, addStackLayerFromThread, addWorkspace, adoptThread, agentGitPrompt, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendIndexedGitConfig, appendMessage, applyAgentEvent, applyAgentRunnerHeapEnv, applyAppEnvironment, applyCompaction, applyGithubGitAuthEnv, applyPromptCacheTtlEnv, applyThreadIntoMain, applyTurnUsage, armSchedules, assertOrchestratorCapableAgent, attachmentFromAbsolutePath, attachmentsFromBuffers, attachmentsFromWorktreePaths, attachmentsGitignoreBody, autoArchiveOnMergeEnabled, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyInjectWorktreeMcpEnabled, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildDiffCommentAttachment, buildForkTranscriptAttachment, buildPastedTextAttachment, buildReviewRequestAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateHoldPath, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, caffeinateWhileSchedulesEnabled, caffeinateWhileSlackListenEnabled, captureLoginEnv, captureTurnBaseline, checkoutPrStackLayer, childEnvWithAppSettings, claimDesktopHost, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, codexSandboxWritableRootsArgs, codexUnattendedGitConfigArgs, coerceOrchestratorAgent, collectTakenTeamSlugs, commentLinearIssue, commitAll, computeNextRunAt, conductorBundledBinDir, conductorDbPath, confirmLand, connectBrightsyTeam, connectSlackToken, contextTokens, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, cowboyModeEnabled, createChatTab, createEmptyThread, createExistingBranchWorktree, createGlobalChat, createLinearIssue, createLinearPkce, createOrUpdatePr, createPrStack, createSchedule, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, defaultScheduleName, deleteBranchOnPurgeEnabled, deleteSchedule, deleteThreadRecord, desktopHostPidPath, detectAgents, detectGhStack, detectLocalMergeConflicts, disconnectBrightsyTeam, disconnectLinear, disconnectLinearConnection, disconnectSlackWorkspace, discoverSkills, dismissSlackReplyBadge, dropCachedPrefixOnResume, encodeBrightsyTarget, enrichPathWithNpmGlobalBin, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGhPreferOrigin, ensureGlobalCoordinatorCwd, ensureReviewRequestFile, ensureReviewSkillFile, ensureSlackCoordinator, ensureSlackDeviceIdentity, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractGhErrorDetail, extractPendingPlanQuestions, extractPresentedPlan, extractiveSummary, fetchPrHead, finalizeParts, findConventionSetup, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findSlackCoordinator, findThreadByRef, findThreadForStackLayer, fireSchedule, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatArtifactDirective, formatBrightsyFetchError, formatFetchError, formatGhLandError, formatGitAuthModeDirective, formatIpcInvokeError, formatMergePrError, formatMessagesAsTranscript, formatPlanQuestionAnswers, formatPlanQuestionsForChat, formatProcessGuideDirective, formatRateLimitResetHint, formatRenameBranchDirective, formatScheduleWhen, formatScheduledPrompt, formatSlackExternalReplyPrompt, formatSlackInboundPrompt, formatSlackRepliesForTurn, formatSlackSignedReply, formatSlackWorkingText, formatTranscriptMarkdown, formatUiReminder, formatWorkspaceInventory, formatWorktreeDirective, formatWorktreeReminder, fromInclusiveInputUsage, getAdapter, getAgentSetupInfo, getBrightsySession, getCaffeinateHold, getDefaultAgent, getDefaultEffort, getDefaultFast, getDefaultModel, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getGithubGitAuthMode, getGithubPat, getIssueSource, getLinearApiKey, getLinearAuthToken, getLinearIssue, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrForHeadBranch, getPrMeta, getPrStack, getRepoSetupInfo, getRunMode, getRunScript, getSchedule, getSlackWorkspace, gh, ghHeadRef, ghRepoSelectArgs, git, githubAgentGitEnv, globalAgentCwd, handleSlackInbound, harnessEnvKey, hasBakedLinearOAuth, hasBakedSlackOAuth, hasConductorHook, hasConventionSetup, hasCursorWorktreeSetup, hasEnabledSchedules, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, httpFetch, importConductorWorkspace, importConductorWorkspaceAsync, initPrStack, initStackFromThread, initializeGitRepository, inspectGitWorktree, installAgent, interruptSlackCoordinatorForInbound, isAskUserToolName, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isConductorBundledCli, isCowboyThread, isCursorAutoModel, isDefaultishSourceRef, isDesktopHostAlive, isDirty, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isImageFilePath, isInPrStack, isInboundForThisDesktop, isLinearConnected, isLinearOAuthCancelled, isOrchestratorCapableAgent, isOrchestratorThread, isPidAlive, isPlaceholderBranch, isPollWrapperToolName, isPrNotMergeableError, isPresentPlanToolName, isPrimaryCheckoutThread, isSessionQuotaLimit, isSideboardScratchPath, isSlackCoordinatorThread, isSlackExternalReplyPrompt, isSlackOAuthCancelled, isSubagentToolName, isThinkingEffort, isThisProcessDesktopHost, isThreadCaffeinated, isWorkspaceScratchPath, lastRequestOccupancy, linearAuthorizationHeader, linearGraphql, linearOAuthAuthorizeUrl, linearOAuthCredentials, listAgentSetupInfo, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listCodexModels, listConductorWorkspaces, listConnectedBrightsyTeams, listCursorModels, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listLinearTeams, listModelsForAgent, listOpencodeModels, listPrs, listRunScripts, listSchedules, listSlackOutboundWatches, listSlackReplyBadges, listSlackWorkspaces, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, liveActivitySummary, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, loginAgent, lookupSoccerTeam, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergeAgentGitAuthEnv, mergePr, mergePrStack, mergeSideboardIntoMcpServersJson, mergeUsage, messagePartParentId, nextPastedTextName, nextThinkingEffort, nonInteractiveGitProcessEnv, normalizeParseResult, normalizeThinkingEffort, normalizeThread, normalizeTurnInput, normalizeWorktreePath, openInSystemTerminal, openPrStackLayers, openStackLayer, opencodeAdapter, orchestrationQuotaFallbackAgent, orchestrationQuotaOnLimit, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, originGhRepoEnv, parseCursorRunnerLine, parseDurationMs, parseForceStopMessage, parseGhStackViewJson, parseGithubSlugFromRemoteUrl, parseMcpList, parsePlanQuestionsInput, parseSessionQuotaResetAt, parseSlackRelayClientMessage, parseSlackRelayServerMessage, partsToAssistantText, pastedTextStats, pendingSlackExternalReplies, permalinkForSlackReplyBadge, permissionMode, persistVaultKeyInKeychain, planFileAbs, posixShellSingleQuote, prepareTerminalCommand, previewLand, promptMentionsBrightsy, pushBranch, readExistingReviewRequestFile, readKeychainVaultKey, readPlanFile, readSkillBody, readThread, readWorktreeFile, readWorktreeFileForUpload, readWorktreeInclude, recordScheduleRun, recordSlackOutboundWatch, refreshGitHubAuth, refreshSlackReplyBadges, registerPackagedUserMcpClients, releaseCaffeinateHoldForThread, releaseDesktopHost, removeWorkspace, removeWorktree, repoSlug, requestOccupancy, requestReview, requireAgent, resetGhStackDetectCache, resetGithubAgentTokenMemo, resolveAgentExecutable, resolveAgentGitAuthEnv, resolveClaudeExecutable, resolveCodexGitWritableRoots, resolveCommandBinarySync, resolveConductorCursorAgentId, resolveCursorModelId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGhAuthToken, resolveGitDirsForLockRecovery, resolveGithubAgentToken, resolveGithubRepoSlug, resolveLinearState, resolveLinearTeam, resolveLoginCommand, resolveNewThreadOptions, resolvePlanMarkdown, resolvePrSelector, resolvePrSelectors, resolveQuotaFallbackAgent, resolveRepoRoot, resolveReviewGuidelines, resolveScheduleThreadId, resolveSlackListenMode, resolveThreadDefaults, resolveThreadEffort, resolveVaultKey, resolveWorktreeStartPoint, rewriteLinearError, run, runArchiveScript, runCloudConnect, runConventionSetup, runCursorWorktreeSetup, runSetupScript, runSlackListen, runSlackRelayClient, runWorkspaceSetup, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, saveLinearOAuth, schedulesPath, scrubGithubTokensFromChildEnv, secureFileUnlocksWith, setCaffeinateHold, setHttpFetchImpl, setStatus, setVaultMasterKey, settingsSourceLabel, shouldAttachPastedText, shouldCompactContext, shouldInjectBrightsyMcp, shouldRefreshReviewRequestTemplate, shouldRemoveWorktreeOnTeardown, shouldResetSessionForOccupancy, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardMcpProfile, sideboardReposDir, sideboardWorkspacesDir, slackAppLevelToken, slackArchiveUrl, slackCoordinatorSourceRef, slackListenEnabled, slackOAuthCredentials, slackOAuthResultUrl, slackRelayUrl, slugify, spawnAgentTurn, splitForCompaction, stackAgentDefaultsFrom, stackIdFrom, stackMergeReadiness, stageAbsolutePathsAsAttachments, stageBuffersAsAttachments, startDevServer, startLinearOAuth, startMcpServer, startOrchestration, startSlackOAuth, startSlackRelayServer, stripBrightsyNdjsonNoise, stripNestedElectronEnv, submitPrStack, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, thinkingEffortBars, thinkingEffortLabel, thisProcessShouldDrainAgentQueues, threadDisplayLabel, threadFilePath, threadLivePath, threadLockPath, threadRequestsBrightsyMcp, threadsDir, threadsSharingWorktree, toPublicAppSettings, toolActivityLine, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAgentExecutable, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateCodexSettings, updateDefaultsSettings, updateIntegrationsSettings, updateLinearIssue, updateOpencodeSettings, updateSchedule, updateThread, userClaudeMcpConfigPath, userCursorMcpConfigPath, validateLinearApiKey, waitForPidExit, warmGithubAgentAuth, withAgentInstructions, withEventParentId, withEventsParentId, withExportedPath, withMaxOldSpaceSize, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, wrapReviewSkillMarkdown, writeInjectedMcpConfig, writePlanFile, writeThread, writeWorktreeFile };
4753
+ export { AGENT_GIT_ACTIONS, AGENT_RUNNER_MAX_OLD_SPACE_MB, ATTACHMENTS_DIR, type ActiveRun, type AddStackLayerInput, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentGitAction, type AgentInstructionFile, type AgentKind, type AgentModelCatalog, type AgentModelInfo, type AgentSetupActionResult, type AgentSetupInfo, type AgentSetupKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BAKED_SLACK_RELAY_URL, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CLAUDE_MODEL_CATALOG, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, CONVENTION_SETUP_RELPATHS, COORDINATOR_TOOL_PLAYBOOK, type CaffeinateHoldState, type ClaudeHarnessSettings, type CleanupOrphansResult, type CliAgentKind, type CliExecutableSettings, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ComposerFileBuffer, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type ConventionSetupFile, type CowboyThreadFields, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateScheduledTaskInput, type CreateStackInput, type CreateThreadInput, type CreateWorktreeResult, type CursorModelInfo, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DefaultsAppSettings, type DevServerHandle, type DiffCommentInput, type DiffCommentLine, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GITHUB_GIT_AUTH_MODES, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GhStackStatus, type GitHubStatus, type GitWorktreeStatus, type GithubGitAuthMode, HARNESS_ENV_KEYS, type HarnessId, type InitStackFromThreadInput, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, LEGACY_ATTACHMENTS_DIR, LEGACY_PLAN_FILE_REL, LEGACY_REVIEW_REQUEST_PATH, LINEAR_OAUTH_CANCELLED, LINEAR_OAUTH_PORT, LINEAR_OAUTH_REDIRECT, LINEAR_OAUTH_SCOPES, type LandPreview, type LandResult, type LinearComment, type LinearIssue, LinearOAuthCancelledError, type LinearTeam, type LinearTeamsResult, type LinearWorkflowState, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, ORCHESTRATOR_AGENT_KINDS, type OpenPrStackLayersInput, type OpenStackLayerInput, type OpenStackLayerResult, type OrchestrationQuotaOnLimit, Orchestrator, type OrchestratorAgentKind, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PASTE_ATTACH_MIN_CHARS, PASTE_ATTACH_MIN_LINES, PLAN_FILE_NAME, PLAN_FILE_REL, PLAN_MODE_INSTRUCTION, type PendingPlanQuestions, type PlanQuestion, type PlanQuestionAnswer, type PlanQuestionOption, type PlanToolPartLike, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type PrStack, type PrStackLayer, type PresentedPlan, type PublicAppSettings, type PublicIntegrationsSettings, REPO_REVIEW_NAME, REPO_REVIEW_PATH, REVIEW_REQUEST_NAME, REVIEW_REQUEST_PATH, REVIEW_REQUEST_PREFILL, REVIEW_REQUEST_TEMPLATE, REVIEW_SKILL_NAME, REVIEW_SKILL_PATH, type RepoSettings, type RepoSetupInfo, type RequestReviewResult, type ResolvedReviewGuidelines, type ReviewGuidelinesSource, type RunMode, type RunScript, SESSION_RESET_OCCUPANCY_TOKENS, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, SIDEBOARD_MCP_PROFILE_ENV, SLACK_LISTEN_STOPPED_REPLY, SLACK_LISTEN_TIMEOUT_REPLY, SLACK_OAUTH_CANCELLED, SLACK_OAUTH_REDIRECT, SLACK_PROGRESS_DELAY_MS, SLACK_PROGRESS_EDIT_MS, SLACK_REPLY_FORMATTING, SLACK_SEEN_REACTION, type ScheduleCreatedBy, type ScheduleWhen, type ScheduledTask, type ScriptHandle, type SetupRunResult, type SideboardMcpProfile, type SkillInfo, type SlackInboundMessage, type SlackListenOptions, type SlackListenStatus, SlackOAuthCancelledError, type SlackOutboundReply, type SlackOutboundWatch, type SlackRelayClientMessage, type SlackRelayClientOptions, SlackRelayHub, type SlackRelayServerHandle, type SlackRelayServerMessage, type SlackRelayServerOptions, type SlackReplyBadge, type SlackWorkspaceInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, THINKING_EFFORTS, type TeamName, type ThinkingEffort, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type ToolPartLike, type TranscriptToolDetail, type TurnCommand, type UpdateScheduledTaskPatch, type UsageScope, WORKTREE_MCP_TOOLS, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, ackSlackInboundSeen, addPrStackLayer, addStackLayerFromThread, addWorkspace, adoptThread, agentGitPrompt, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendIndexedGitConfig, appendMessage, applyAgentEvent, applyAgentRunnerHeapEnv, applyAppEnvironment, applyCompaction, applyGithubGitAuthEnv, applyPromptCacheTtlEnv, applyThreadIntoMain, applyTurnUsage, armSchedules, assertOrchestratorCapableAgent, attachmentFromAbsolutePath, attachmentsFromBuffers, attachmentsFromWorktreePaths, attachmentsGitignoreBody, autoArchiveOnMergeEnabled, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyInjectWorktreeMcpEnabled, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildDiffCommentAttachment, buildForkTranscriptAttachment, buildPastedTextAttachment, buildReviewRequestAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateHoldPath, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, caffeinateWhileSchedulesEnabled, caffeinateWhileSlackListenEnabled, captureLoginEnv, captureTurnBaseline, checkoutPrStackLayer, childEnvWithAppSettings, claimDesktopHost, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, codexSandboxWritableRootsArgs, codexUnattendedGitConfigArgs, coerceOrchestratorAgent, collectTakenTeamSlugs, commentLinearIssue, commitAll, computeNextRunAt, conductorBundledBinDir, conductorDbPath, confirmLand, connectBrightsyTeam, connectSlackToken, contextTokens, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, cowboyModeEnabled, createChatTab, createEmptyThread, createExistingBranchWorktree, createGlobalChat, createLinearIssue, createLinearPkce, createOrUpdatePr, createPrStack, createSchedule, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, defaultScheduleName, deleteBranchOnPurgeEnabled, deleteSchedule, deleteThreadRecord, desktopHostPidPath, detectAgents, detectGhStack, detectLocalMergeConflicts, disconnectBrightsyTeam, disconnectLinear, disconnectLinearConnection, disconnectSlackWorkspace, discoverSkills, dismissSlackReplyBadge, dropCachedPrefixOnResume, encodeBrightsyTarget, enrichPathWithNpmGlobalBin, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGhPreferOrigin, ensureGlobalCoordinatorCwd, ensureReviewRequestFile, ensureReviewSkillFile, ensureSlackCoordinator, ensureSlackDeviceIdentity, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractGhErrorDetail, extractPendingPlanQuestions, extractPresentedPlan, extractiveSummary, fetchPrHead, finalizeParts, findConventionSetup, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findSlackCoordinator, findThreadByRef, findThreadForStackLayer, fireSchedule, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatArtifactDirective, formatBrightsyFetchError, formatFetchError, formatGhLandError, formatGitAuthModeDirective, formatIpcInvokeError, formatMergePrError, formatMessagesAsTranscript, formatPlanQuestionAnswers, formatPlanQuestionsForChat, formatProcessGuideDirective, formatRateLimitResetHint, formatRenameBranchDirective, formatScheduleWhen, formatScheduledPrompt, formatSlackExternalReplyPrompt, formatSlackInboundPrompt, formatSlackRepliesForTurn, formatSlackSignedReply, formatSlackWorkingText, formatTranscriptMarkdown, formatUiReminder, formatWorkspaceInventory, formatWorktreeDirective, formatWorktreeReminder, fromInclusiveInputUsage, getAdapter, getAgentSetupInfo, getBrightsySession, getCaffeinateHold, getDefaultAgent, getDefaultEffort, getDefaultFast, getDefaultModel, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getGithubGitAuthMode, getGithubPat, getIssueSource, getLinearApiKey, getLinearAuthToken, getLinearIssue, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrForHeadBranch, getPrMeta, getPrStack, getRepoSetupInfo, getRunMode, getRunScript, getSchedule, getSlackWorkspace, gh, ghHeadRef, ghRepoSelectArgs, git, githubAgentGitEnv, globalAgentCwd, handleSlackInbound, harnessEnvKey, hasBakedLinearOAuth, hasBakedSlackOAuth, hasConductorHook, hasConventionSetup, hasCursorWorktreeSetup, hasEnabledSchedules, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, httpFetch, importConductorWorkspace, importConductorWorkspaceAsync, initPrStack, initStackFromThread, initializeGitRepository, inspectGitWorktree, installAgent, interruptSlackCoordinatorForInbound, isAskUserToolName, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isConductorBundledCli, isCowboyThread, isCursorAutoModel, isDefaultishSourceRef, isDesktopHostAlive, isDirty, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isImageFilePath, isInPrStack, isInboundForThisDesktop, isLinearConnected, isLinearOAuthCancelled, isOrchestratorCapableAgent, isOrchestratorThread, isPidAlive, isPlaceholderBranch, isPollWrapperToolName, isPrNotMergeableError, isPresentPlanToolName, isPrimaryCheckoutThread, isSessionQuotaLimit, isShellToolName, isSideboardScratchPath, isSlackCoordinatorThread, isSlackExternalReplyPrompt, isSlackOAuthCancelled, isSubagentToolName, isThinkingEffort, isThisProcessDesktopHost, isThreadCaffeinated, isWorkspaceScratchPath, lastRequestOccupancy, linearAuthorizationHeader, linearGraphql, linearOAuthAuthorizeUrl, linearOAuthCredentials, listAgentSetupInfo, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listCodexModels, listConductorWorkspaces, listConnectedBrightsyTeams, listCursorModels, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listLinearTeams, listModelsForAgent, listOpencodeModels, listPrs, listRunScripts, listSchedules, listSlackOutboundWatches, listSlackReplyBadges, listSlackWorkspaces, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, liveActivitySummary, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, loginAgent, lookupSoccerTeam, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergeAgentGitAuthEnv, mergePr, mergePrStack, mergeSideboardIntoMcpServersJson, mergeUsage, messagePartParentId, nextPastedTextName, nextThinkingEffort, nonInteractiveGitProcessEnv, normalizeParseResult, normalizeThinkingEffort, normalizeThread, normalizeTurnInput, normalizeWorktreePath, openInSystemTerminal, openPrStackLayers, openStackLayer, opencodeAdapter, orchestrationQuotaFallbackAgent, orchestrationQuotaOnLimit, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, originGhRepoEnv, parseCursorRunnerLine, parseDurationMs, parseForceStopMessage, parseGhStackViewJson, parseGithubSlugFromRemoteUrl, parseMcpList, parsePlanQuestionsInput, parseSessionQuotaResetAt, parseSlackRelayClientMessage, parseSlackRelayServerMessage, partsToAssistantText, pastedTextStats, pendingSlackExternalReplies, permalinkForSlackReplyBadge, permissionMode, persistVaultKeyInKeychain, planFileAbs, posixShellSingleQuote, prepareTerminalCommand, previewLand, promptMentionsBrightsy, pushBranch, readExistingReviewRequestFile, readKeychainVaultKey, readPlanFile, readSkillBody, readThread, readWorktreeFile, readWorktreeFileForUpload, readWorktreeInclude, recordScheduleRun, recordSlackOutboundWatch, refreshGitHubAuth, refreshSlackReplyBadges, registerPackagedUserMcpClients, releaseCaffeinateHoldForThread, releaseDesktopHost, removeWorkspace, removeWorktree, repoSlug, requestOccupancy, requestReview, requireAgent, resetGhStackDetectCache, resetGithubAgentTokenMemo, resolveAgentExecutable, resolveAgentGitAuthEnv, resolveClaudeExecutable, resolveCodexGitWritableRoots, resolveCommandBinarySync, resolveConductorCursorAgentId, resolveCursorModelId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGhAuthToken, resolveGitDirsForLockRecovery, resolveGithubAgentToken, resolveGithubRepoSlug, resolveLinearState, resolveLinearTeam, resolveLoginCommand, resolveNewThreadOptions, resolvePlanMarkdown, resolvePrSelector, resolvePrSelectors, resolveQuotaFallbackAgent, resolveRepoRoot, resolveReviewGuidelines, resolveScheduleThreadId, resolveSlackListenMode, resolveThreadDefaults, resolveThreadEffort, resolveVaultKey, resolveWorktreeStartPoint, rewriteLinearError, run, runArchiveScript, runCloudConnect, runConventionSetup, runCursorWorktreeSetup, runSetupScript, runSlackListen, runSlackRelayClient, runWorkspaceSetup, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, saveLinearOAuth, schedulesPath, scrubGithubTokensFromChildEnv, secureFileUnlocksWith, setCaffeinateHold, setHttpFetchImpl, setStatus, setVaultMasterKey, settingsSourceLabel, shouldAttachPastedText, shouldCompactContext, shouldInjectBrightsyMcp, shouldRefreshReviewRequestTemplate, shouldRemoveWorktreeOnTeardown, shouldResetSessionForOccupancy, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardMcpProfile, sideboardReposDir, sideboardWorkspacesDir, slackAppLevelToken, slackArchiveUrl, slackCoordinatorSourceRef, slackListenEnabled, slackOAuthCredentials, slackOAuthResultUrl, slackRelayUrl, slugify, spawnAgentTurn, splitForCompaction, stackAgentDefaultsFrom, stackIdFrom, stackMergeReadiness, stageAbsolutePathsAsAttachments, stageBuffersAsAttachments, startDevServer, startLinearOAuth, startMcpServer, startOrchestration, startSlackOAuth, startSlackRelayServer, stripBrightsyNdjsonNoise, stripNestedElectronEnv, submitPrStack, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, thinkingEffortBars, thinkingEffortLabel, thisProcessShouldDrainAgentQueues, threadDisplayLabel, threadFilePath, threadLivePath, threadLockPath, threadRequestsBrightsyMcp, threadsDir, threadsSharingWorktree, toPublicAppSettings, toolActivityLine, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAgentExecutable, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateCodexSettings, updateDefaultsSettings, updateIntegrationsSettings, updateLinearIssue, updateOpencodeSettings, updateSchedule, updateThread, userClaudeMcpConfigPath, userCursorMcpConfigPath, validateLinearApiKey, waitForPidExit, warmGithubAgentAuth, withAgentInstructions, withEventParentId, withEventsParentId, withExportedPath, withMaxOldSpaceSize, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, wrapReviewSkillMarkdown, writeInjectedMcpConfig, writePlanFile, writeThread, writeWorktreeFile };
package/dist/index.js CHANGED
@@ -170,7 +170,7 @@ import {
170
170
  worktreeCleanupSettings,
171
171
  wrapReviewSkillMarkdown,
172
172
  writeWorktreeFile
173
- } from "./chunk-DCNR7NAL.js";
173
+ } from "./chunk-DWP25N32.js";
174
174
  import {
175
175
  BRIGHTSY_MCP_ALLOWED_TOOLS,
176
176
  CLAUDE_MODEL_CATALOG,
@@ -206,6 +206,7 @@ import {
206
206
  isCursorAutoModel,
207
207
  isPollWrapperToolName,
208
208
  isSessionQuotaLimit,
209
+ isShellToolName,
209
210
  isSubagentToolName,
210
211
  listAgentSetupInfo,
211
212
  listBrightsyChatTargets,
@@ -247,7 +248,7 @@ import {
247
248
  withEventParentId,
248
249
  withEventsParentId,
249
250
  writeInjectedMcpConfig
250
- } from "./chunk-C6OBY6IC.js";
251
+ } from "./chunk-5KSLD4MU.js";
251
252
  import {
252
253
  brightsyConfigPath,
253
254
  brightsyMcpServerName,
@@ -322,7 +323,7 @@ import {
322
323
  cursorSdkMessageToEvents,
323
324
  parseCursorRunnerLine,
324
325
  withMaxOldSpaceSize
325
- } from "./chunk-SLU5JVKD.js";
326
+ } from "./chunk-GBY7OOMB.js";
326
327
  import {
327
328
  caffeinateHoldPath,
328
329
  getCaffeinateHold,
@@ -2342,7 +2343,7 @@ async function startMcpServer() {
2342
2343
  }
2343
2344
  server.tool(
2344
2345
  "present_artifact",
2345
- "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
2346
+ "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Do not also emit the same document as a chat html/markdown fence. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
2346
2347
  {
2347
2348
  title: z4.string().describe("Short title shown in the artifact pane header"),
2348
2349
  type: z4.enum(["html", "svg", "markdown", "react"]).describe(
@@ -2419,7 +2420,7 @@ async function startMcpServer() {
2419
2420
  );
2420
2421
  server.tool(
2421
2422
  "present_schema",
2422
- "Open Sideboard\u2019s schema-driven side column (filterable table and/or form). Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
2423
+ "Open Sideboard\u2019s schema-driven side column (filterable table and/or form) when the user needs to filter, edit, publish, or persist records. Do not call this just to re-display rows you already wrote as a markdown table. If the user asks for an editable / interactive table, call this even if chat already showed those rows. Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
2423
2424
  {
2424
2425
  title: z4.string().describe("Pane title"),
2425
2426
  mode: z4.enum(["table", "form"]).optional().describe("table = list/filter records; form = edit one record"),
@@ -5905,6 +5906,7 @@ export {
5905
5906
  isPresentPlanToolName,
5906
5907
  isPrimaryCheckoutThread,
5907
5908
  isSessionQuotaLimit,
5909
+ isShellToolName,
5908
5910
  isSideboardScratchPath,
5909
5911
  isSlackCoordinatorThread,
5910
5912
  isSlackExternalReplyPrompt,
@@ -7088,6 +7088,30 @@ function applyAgentEvent(parts, event) {
7088
7088
  if (event.type === "tool_result") {
7089
7089
  const existing = parts.findIndex((p) => p.type === "tool" && p.id === event.id);
7090
7090
  const fromResult = parseDiffStat(event.content);
7091
+ if (event.partial) {
7092
+ if (existing < 0) {
7093
+ return [
7094
+ ...parts,
7095
+ {
7096
+ type: "tool",
7097
+ id: event.id,
7098
+ name: "tool",
7099
+ description: "tool",
7100
+ status: event.isError ? "error" : "running",
7101
+ result: event.content,
7102
+ ...event.parentId ? { parentId: event.parentId } : {}
7103
+ }
7104
+ ];
7105
+ }
7106
+ return parts.map((p, i) => {
7107
+ if (i !== existing || p.type !== "tool") return p;
7108
+ if (p.status === "done" || p.status === "error") return p;
7109
+ return {
7110
+ ...p,
7111
+ result: event.content ?? p.result
7112
+ };
7113
+ });
7114
+ }
7091
7115
  if (existing < 0) {
7092
7116
  return [
7093
7117
  ...parts,
@@ -8506,13 +8530,22 @@ var init_codex = __esm({
8506
8530
  const events = [
8507
8531
  { type: "tool_use", id: item.id, name: "Bash", input }
8508
8532
  ];
8509
- if (type === "item.completed" || item.status === "completed" || item.status === "failed") {
8533
+ const finished = type === "item.completed" || item.status === "completed" || item.status === "failed";
8534
+ const output = typeof item.aggregated_output === "string" && item.aggregated_output ? item.aggregated_output : void 0;
8535
+ if (finished) {
8510
8536
  events.push({
8511
8537
  type: "tool_result",
8512
8538
  id: item.id,
8513
- content: item.aggregated_output,
8539
+ content: output,
8514
8540
  isError: item.status === "failed"
8515
8541
  });
8542
+ } else if (output) {
8543
+ events.push({
8544
+ type: "tool_result",
8545
+ id: item.id,
8546
+ content: output,
8547
+ partial: true
8548
+ });
8516
8549
  }
8517
8550
  return events.length === 1 ? events[0] : events;
8518
8551
  }
@@ -8728,7 +8761,7 @@ function cursorSdkMessageToEvents(msg) {
8728
8761
  if (msg.type === "tool_call" && msg.call_id && msg.name) {
8729
8762
  const normalized = normalizeCursorToolCall(msg.name, msg.args);
8730
8763
  if (msg.status === "running") {
8731
- return [
8764
+ const events = [
8732
8765
  {
8733
8766
  type: "tool_use",
8734
8767
  id: msg.call_id,
@@ -8736,6 +8769,16 @@ function cursorSdkMessageToEvents(msg) {
8736
8769
  input: normalized.input
8737
8770
  }
8738
8771
  ];
8772
+ const live = unwrapCursorToolResult(msg.result);
8773
+ if (live) {
8774
+ events.push({
8775
+ type: "tool_result",
8776
+ id: msg.call_id,
8777
+ content: live,
8778
+ partial: true
8779
+ });
8780
+ }
8781
+ return events;
8739
8782
  }
8740
8783
  if (msg.status === "completed" || msg.status === "error") {
8741
8784
  return [
@@ -9253,13 +9296,16 @@ var init_opencode = __esm({
9253
9296
  );
9254
9297
  const events = [{ type: "tool_use", id, name, input }];
9255
9298
  const output = state?.output;
9256
- if (output != null || state?.status === "completed" || state?.status === "error") {
9299
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
9300
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
9301
+ if (output != null || finished) {
9257
9302
  const content = typeof output === "string" ? output : output != null ? JSON.stringify(output) : formatUnknownDetail(state?.error) || void 0;
9258
9303
  events.push({
9259
9304
  type: "tool_result",
9260
9305
  id,
9261
9306
  content,
9262
- isError: state?.status === "error" || state?.status === "failed"
9307
+ isError: state?.status === "error" || state?.status === "failed",
9308
+ ...running && !finished ? { partial: true } : {}
9263
9309
  });
9264
9310
  }
9265
9311
  return events.length === 1 ? events[0] : events;
@@ -9294,14 +9340,17 @@ var init_opencode = __esm({
9294
9340
  withEventParentId({ type: "tool_use", id, name, input }, parentId)
9295
9341
  ];
9296
9342
  const output = state?.output ?? part.output;
9297
- if (output != null || state?.status === "completed" || state?.status === "error") {
9343
+ const finished = state?.status === "completed" || state?.status === "error" || state?.status === "failed";
9344
+ const running = state?.status === "running" || state?.status === "in_progress" || state?.status === "pending";
9345
+ if (output != null || finished) {
9298
9346
  nested.push(
9299
9347
  withEventParentId(
9300
9348
  {
9301
9349
  type: "tool_result",
9302
9350
  id,
9303
9351
  content: typeof output === "string" ? output : output != null ? JSON.stringify(output) : void 0,
9304
- isError: state?.status === "error" || state?.status === "failed"
9352
+ isError: state?.status === "error" || state?.status === "failed",
9353
+ ...running && !finished ? { partial: true } : {}
9305
9354
  },
9306
9355
  parentId
9307
9356
  )
@@ -14244,14 +14293,15 @@ function formatArtifactDirective() {
14244
14293
  return [
14245
14294
  "Sideboard side column (desktop UI):",
14246
14295
  "claude.ai\u2019s \u201CArtifact\u201D tool does NOT exist in Claude Code. That is expected.",
14296
+ "Do not unprompted-duplicate a payload. Chat markdown (including tables) already renders in the transcript \u2014 do not also call present_schema with those same rows just to display them. If the user asks for an editable / interactive table, call present_schema even if markdown already showed the data. Do not also call present_artifact for a document you already fenced in chat.",
14247
14297
  "Documents (HTML/SVG/markdown):",
14248
14298
  "1) Emit a fenced code block tagged `html` (preferred), `svg`, or `markdown` with the FULL document \u2014 Sideboard opens a side column. Example:",
14249
14299
  "```html",
14250
14300
  "<!DOCTYPE html><html><head><title>Demo</title></head><body><h1>Hi</h1></body></html>",
14251
14301
  "```",
14252
- "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content.",
14302
+ "2) Or call Sideboard MCP `present_artifact` with title, type (html|svg|markdown), and content \u2014 not both a fence and this tool for the same body.",
14253
14303
  "CMS / JSON Schema forms & tables (Brightsy or any schema+schemaUi source):",
14254
- "3) Call Sideboard MCP `present_schema` with title, mode (table|form), and either:",
14304
+ "3) Call Sideboard MCP `present_schema` when the user needs to filter, edit, publish, or persist rows \u2014 including after you already showed a markdown table, if they then ask for an editable table. If they only need to read the data, a markdown table is enough. When you do call it, pass title, mode (table|form), and either:",
14255
14305
  " - datasource=brightsy + resource_id (record type UUID) after fetching types via Brightsy MCP, or",
14256
14306
  " - datasource=inline + resource: { id, title, schema, schemaUi } and optional records/record.",
14257
14307
  "Files / media browser (CMS file manager column):",
@@ -14260,11 +14310,11 @@ function formatArtifactDirective() {
14260
14310
  "Multiple-choice questions:",
14261
14311
  "5) Call Sideboard MCP `ask_user` only when work is blocked on choosing among a few concrete options (approach forks, which API, auth vs cookies). First write a short chat message that explains the decision and what each option means (tradeoffs, when to pick it). Include a description on every option. After calling, stop and wait for their next message with answers. If you are asking a real multiple-choice, use ask_user rather than chat bullets so Sideboard shows the composer picker.",
14262
14312
  "Do not call ask_user for greetings, check-ins, \u201Chello\u201D, open-ended how-can-I-help, or to invent a menu of possible next tasks \u2014 reply in chat. If one option is the obvious default, proceed without asking.",
14263
- "Never say artifacts, CMS UI, or the Files column are unavailable. Prefer present_schema for list/edit/publish; present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
14313
+ "Never say artifacts, CMS UI, or the Files column are unavailable. present_schema is for interactive list/edit/publish (use it when they ask to edit, even if chat already had a markdown table); present_files for storage UI; html fences for standalone pages; ask_user only for those blocked predefined-option questions."
14264
14314
  ].join("\n");
14265
14315
  }
14266
14316
  function formatUiReminder() {
14267
- return "Sideboard UI: html fence or present_artifact / present_schema / present_files; ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
14317
+ 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. ask_user only for a real multiple-choice (not hellos or \u201Cwhat next?\u201D) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
14268
14318
  }
14269
14319
  var import_node_fs40, import_node_path36;
14270
14320
  var init_instructions = __esm({
@@ -18335,7 +18385,7 @@ async function startMcpServer() {
18335
18385
  }
18336
18386
  server.tool(
18337
18387
  "present_artifact",
18338
- "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
18388
+ "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Do not also emit the same document as a chat html/markdown fence. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
18339
18389
  {
18340
18390
  title: import_zod4.z.string().describe("Short title shown in the artifact pane header"),
18341
18391
  type: import_zod4.z.enum(["html", "svg", "markdown", "react"]).describe(
@@ -18412,7 +18462,7 @@ async function startMcpServer() {
18412
18462
  );
18413
18463
  server.tool(
18414
18464
  "present_schema",
18415
- "Open Sideboard\u2019s schema-driven side column (filterable table and/or form). Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
18465
+ "Open Sideboard\u2019s schema-driven side column (filterable table and/or form) when the user needs to filter, edit, publish, or persist records. Do not call this just to re-display rows you already wrote as a markdown table. If the user asks for an editable / interactive table, call this even if chat already showed those rows. Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
18416
18466
  {
18417
18467
  title: import_zod4.z.string().describe("Pane title"),
18418
18468
  mode: import_zod4.z.enum(["table", "form"]).optional().describe("table = list/filter records; form = edit one record"),
@@ -19,11 +19,11 @@ import {
19
19
  slackApi,
20
20
  slackTokenFor,
21
21
  updateSchedule
22
- } from "../chunk-MZ6HJ7VL.js";
22
+ } from "../chunk-4HOFVKPC.js";
23
23
  import {
24
24
  listModelsForAgent,
25
25
  sideboardMcpProfile
26
- } from "../chunk-66XTXHR3.js";
26
+ } from "../chunk-OFF5AFCR.js";
27
27
  import "../chunk-YMRT2DU6.js";
28
28
  import "../chunk-ZRCX43LS.js";
29
29
  import "../chunk-N5PM7HGQ.js";
@@ -1435,7 +1435,7 @@ async function startMcpServer() {
1435
1435
  }
1436
1436
  server.tool(
1437
1437
  "present_artifact",
1438
- "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
1438
+ "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Do not also emit the same document as a chat html/markdown fence. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
1439
1439
  {
1440
1440
  title: z4.string().describe("Short title shown in the artifact pane header"),
1441
1441
  type: z4.enum(["html", "svg", "markdown", "react"]).describe(
@@ -1512,7 +1512,7 @@ async function startMcpServer() {
1512
1512
  );
1513
1513
  server.tool(
1514
1514
  "present_schema",
1515
- "Open Sideboard\u2019s schema-driven side column (filterable table and/or form). Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
1515
+ "Open Sideboard\u2019s schema-driven side column (filterable table and/or form) when the user needs to filter, edit, publish, or persist records. Do not call this just to re-display rows you already wrote as a markdown table. If the user asks for an editable / interactive table, call this even if chat already showed those rows. Pass JSON Schema + optional schemaUi. Prefer datasource=inline with embedded resource/records. Use datasource=brightsy with resource_id only when the user is logged into Brightsy.",
1516
1516
  {
1517
1517
  title: z4.string().describe("Pane title"),
1518
1518
  mode: z4.enum(["table", "form"]).optional().describe("table = list/filter records; form = edit one record"),
@@ -6,8 +6,8 @@ import {
6
6
  isPidAlive,
7
7
  startOrchestration,
8
8
  waitForPidExit
9
- } from "./chunk-MZ6HJ7VL.js";
10
- import "./chunk-66XTXHR3.js";
9
+ } from "./chunk-4HOFVKPC.js";
10
+ import "./chunk-OFF5AFCR.js";
11
11
  import "./chunk-YMRT2DU6.js";
12
12
  import "./chunk-ZRCX43LS.js";
13
13
  import "./chunk-N5PM7HGQ.js";
@@ -4,15 +4,15 @@ import {
4
4
  isPidAlive,
5
5
  startOrchestration,
6
6
  waitForPidExit
7
- } from "./chunk-DCNR7NAL.js";
8
- import "./chunk-C6OBY6IC.js";
7
+ } from "./chunk-DWP25N32.js";
8
+ import "./chunk-5KSLD4MU.js";
9
9
  import "./chunk-EKIDHL2T.js";
10
10
  import "./chunk-K3TIQXOH.js";
11
11
  import "./chunk-4OJMZ6P2.js";
12
12
  import "./chunk-7WC5UWEB.js";
13
13
  import "./chunk-QTUESPAW.js";
14
14
  import "./chunk-AXQ4ZWHK.js";
15
- import "./chunk-SLU5JVKD.js";
15
+ import "./chunk-GBY7OOMB.js";
16
16
  import "./chunk-DCOZABNT.js";
17
17
  import "./chunk-FZCIQYNQ.js";
18
18
  import "./chunk-FKOIHGKV.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideboard-ai/core",
3
- "version": "0.1.115",
3
+ "version": "0.1.116",
4
4
  "description": "Sideboard core — orchestration, agents, git worktrees, MCP server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",