@sideboard-ai/core 0.1.194 → 0.1.196

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.
package/dist/index.d.cts CHANGED
@@ -4489,9 +4489,12 @@ declare class Orchestrator {
4489
4489
  ports: number[];
4490
4490
  }>;
4491
4491
  stopDev(threadRef: string, scriptName?: string): void;
4492
+ private syncWorktreeRuns;
4492
4493
  listThreadRunScripts(threadRef: string): RunScript[];
4493
4494
  getActiveRuns(threadRef: string): ActiveRun[];
4494
4495
  getSetupLog(threadRef: string): SetupLogSnapshot;
4496
+ private hasWorktreeSetupProcess;
4497
+ private writeSetupLog;
4495
4498
  runSetup(threadRef: string, opts?: {
4496
4499
  stampLastError?: boolean;
4497
4500
  }): Promise<{
package/dist/index.d.ts CHANGED
@@ -4489,9 +4489,12 @@ declare class Orchestrator {
4489
4489
  ports: number[];
4490
4490
  }>;
4491
4491
  stopDev(threadRef: string, scriptName?: string): void;
4492
+ private syncWorktreeRuns;
4492
4493
  listThreadRunScripts(threadRef: string): RunScript[];
4493
4494
  getActiveRuns(threadRef: string): ActiveRun[];
4494
4495
  getSetupLog(threadRef: string): SetupLogSnapshot;
4496
+ private hasWorktreeSetupProcess;
4497
+ private writeSetupLog;
4495
4498
  runSetup(threadRef: string, opts?: {
4496
4499
  stampLastError?: boolean;
4497
4500
  }): Promise<{
package/dist/index.js CHANGED
@@ -268,7 +268,7 @@ import {
268
268
  worktreeCleanupSettings,
269
269
  wrapReviewSkillMarkdown,
270
270
  writeWorktreeFile
271
- } from "./chunk-NY366OEZ.js";
271
+ } from "./chunk-NXXJBRWQ.js";
272
272
  import {
273
273
  LEGACY_PLAN_FILE_REL,
274
274
  PLAN_FILE_NAME,
@@ -374,7 +374,7 @@ import {
374
374
  withEventParentId,
375
375
  withEventsParentId,
376
376
  writeInjectedMcpConfig
377
- } from "./chunk-2X6RGKLI.js";
377
+ } from "./chunk-NWIBA5CP.js";
378
378
  import {
379
379
  CLOUD_COORDINATOR_BUSY_REPLY,
380
380
  CLOUD_COORDINATOR_STOPPED_REPLY,
@@ -10897,6 +10897,9 @@ function toCodexDisableUserMcpArgs(names) {
10897
10897
  }
10898
10898
  return args;
10899
10899
  }
10900
+ function toCodexUnattendedAppsArgs() {
10901
+ return ["-c", "features.apps=false", "-c", "apps._default.enabled=false"];
10902
+ }
10900
10903
  var import_node_fs28, import_node_os11, import_node_path29, import_smol_toml2;
10901
10904
  var init_orch_mcp_isolation = __esm({
10902
10905
  "src/agents/orch-mcp-isolation.ts"() {
@@ -11092,6 +11095,7 @@ var init_codex = __esm({
11092
11095
  orchestratorThreadId: isOrchestrator ? thread.id : null
11093
11096
  });
11094
11097
  const mcpOverrides = [
11098
+ ...toCodexUnattendedAppsArgs(),
11095
11099
  ...toCodexMcpConfigArgs(injected2),
11096
11100
  ...isOrchestrator ? toCodexDisableUserMcpArgs(
11097
11101
  userMcpNamesToDisable({
@@ -13022,6 +13026,59 @@ var init_context_compact = __esm({
13022
13026
  }
13023
13027
  });
13024
13028
 
13029
+ // src/threads/worktree-runtime.ts
13030
+ function worktreeProcessPrefix(worktreePath) {
13031
+ return `wt:${normalizeWorktreePath(worktreePath)}`;
13032
+ }
13033
+ function worktreeSetupProcessKey(worktreePath) {
13034
+ return `${worktreeProcessPrefix(worktreePath)}:setup`;
13035
+ }
13036
+ function worktreeRunProcessKey(worktreePath, scriptName) {
13037
+ return `${worktreeProcessPrefix(worktreePath)}:run:${scriptName}`;
13038
+ }
13039
+ function worktreeDevProcessKey(worktreePath) {
13040
+ return `${worktreeProcessPrefix(worktreePath)}:dev`;
13041
+ }
13042
+ function isWorktreeRunProcessKey(key, worktreePath) {
13043
+ const prefix = worktreeProcessPrefix(worktreePath);
13044
+ return key.startsWith(`${prefix}:run:`) || key === `${prefix}:dev`;
13045
+ }
13046
+ function pickRichestSetupLog(snaps) {
13047
+ let best;
13048
+ for (const snap of snaps) {
13049
+ if (!snap.output && !snap.running && snap.exitCode == null) continue;
13050
+ if (!best) {
13051
+ best = snap;
13052
+ continue;
13053
+ }
13054
+ if (snap.running && !best.running) {
13055
+ best = snap;
13056
+ continue;
13057
+ }
13058
+ if (snap.running === best.running && snap.output.length > best.output.length) {
13059
+ best = snap;
13060
+ }
13061
+ }
13062
+ return best;
13063
+ }
13064
+ function mergeWorktreeActiveRuns(threads) {
13065
+ const byName = /* @__PURE__ */ new Map();
13066
+ let devPort = null;
13067
+ for (const thread of threads) {
13068
+ if (thread.devPort != null && devPort == null) devPort = thread.devPort;
13069
+ for (const run2 of thread.activeRuns ?? []) {
13070
+ if (!byName.has(run2.scriptName)) byName.set(run2.scriptName, run2);
13071
+ }
13072
+ }
13073
+ return { activeRuns: [...byName.values()], devPort };
13074
+ }
13075
+ var init_worktree_runtime = __esm({
13076
+ "src/threads/worktree-runtime.ts"() {
13077
+ "use strict";
13078
+ init_worktree_labels();
13079
+ }
13080
+ });
13081
+
13025
13082
  // src/threads/chat-tabs.ts
13026
13083
  function sameWorktreePath(a, b) {
13027
13084
  return normalizeWorktreePath(a) === normalizeWorktreePath(b);
@@ -13118,7 +13175,8 @@ function createChatTab(input) {
13118
13175
  planMode: from.planMode,
13119
13176
  autonomy: input.autonomy ?? from.autonomy,
13120
13177
  attachments: input.attachments ?? [],
13121
- status: "idle"
13178
+ status: "idle",
13179
+ ...mergeWorktreeActiveRuns(threadsSharingWorktree(binding.worktreePath))
13122
13180
  });
13123
13181
  writeThread(thread);
13124
13182
  return thread;
@@ -13152,6 +13210,7 @@ var init_chat_tabs = __esm({
13152
13210
  init_global_workspace();
13153
13211
  init_orchestrator_capable();
13154
13212
  init_thread_store();
13213
+ init_worktree_runtime();
13155
13214
  init_worktree_labels();
13156
13215
  }
13157
13216
  });
@@ -13820,6 +13879,10 @@ var init_conductor = __esm({
13820
13879
  function setupLogPath(threadId) {
13821
13880
  return (0, import_node_path36.join)(threadsDir(), `${threadId}.setup.log.json`);
13822
13881
  }
13882
+ function setupLogKeyForWorktree(worktreePath) {
13883
+ const norm = normalizeWorktreePath(worktreePath);
13884
+ return `wt-${(0, import_node_crypto8.createHash)("sha1").update(norm).digest("hex").slice(0, 16)}`;
13885
+ }
13823
13886
  function emptySetupLog() {
13824
13887
  return { ...EMPTY };
13825
13888
  }
@@ -13910,12 +13973,14 @@ function finishSetupLog(threadId, exitCode, source) {
13910
13973
  persistNow(threadId);
13911
13974
  return clone(snap);
13912
13975
  }
13913
- var import_node_fs36, import_node_path36, EMPTY, memory, persistTimers;
13976
+ var import_node_crypto8, import_node_fs36, import_node_path36, EMPTY, memory, persistTimers;
13914
13977
  var init_setup_log = __esm({
13915
13978
  "src/store/setup-log.ts"() {
13916
13979
  "use strict";
13980
+ import_node_crypto8 = require("crypto");
13917
13981
  import_node_fs36 = require("fs");
13918
13982
  import_node_path36 = require("path");
13983
+ init_worktree_labels();
13919
13984
  init_paths();
13920
13985
  EMPTY = {
13921
13986
  output: "",
@@ -16384,7 +16449,7 @@ function buildQuotaHandoffAttachment(from, limitText, fallbackAgent) {
16384
16449
  `- Do not wait on the limited ${from.agent} account; keep going on ${fallbackAgent}.`
16385
16450
  ].join("\n");
16386
16451
  return {
16387
- id: (0, import_node_crypto8.randomUUID)(),
16452
+ id: (0, import_node_crypto9.randomUUID)(),
16388
16453
  name: "Orchestration quota handoff.md",
16389
16454
  kind: "transcript",
16390
16455
  content: body
@@ -16405,11 +16470,11 @@ function createQuotaFailoverChat(from, fallbackAgent, limitText) {
16405
16470
  sourceType: "orchestration"
16406
16471
  });
16407
16472
  }
16408
- var import_node_crypto8, QUOTA_CONTINUE_PROMPT, QUOTA_RESUME_PROMPT;
16473
+ var import_node_crypto9, QUOTA_CONTINUE_PROMPT, QUOTA_RESUME_PROMPT;
16409
16474
  var init_quota_failover = __esm({
16410
16475
  "src/orchestrator/quota-failover.ts"() {
16411
16476
  "use strict";
16412
- import_node_crypto8 = require("crypto");
16477
+ import_node_crypto9 = require("crypto");
16413
16478
  init_session_quota();
16414
16479
  init_app_settings();
16415
16480
  init_global_workspace();
@@ -19167,7 +19232,7 @@ function buildTask(input, now) {
19167
19232
  const ts = nowIso2(now);
19168
19233
  const agent = input.agent ? coerceOrchestratorAgent(input.agent) : null;
19169
19234
  return {
19170
- id: (0, import_node_crypto9.randomUUID)(),
19235
+ id: (0, import_node_crypto10.randomUUID)(),
19171
19236
  name: input.name?.trim() || defaultScheduleName(prompt),
19172
19237
  prompt,
19173
19238
  enabled: input.enabled !== false,
@@ -19254,11 +19319,11 @@ function recordScheduleRun(id, result) {
19254
19319
  writeAll2(rows);
19255
19320
  return next;
19256
19321
  }
19257
- var import_node_crypto9, import_node_fs51, import_node_path48, import_croner, DURATION_RE, UNIT_MS;
19322
+ var import_node_crypto10, import_node_fs51, import_node_path48, import_croner, DURATION_RE, UNIT_MS;
19258
19323
  var init_schedules = __esm({
19259
19324
  "src/store/schedules.ts"() {
19260
19325
  "use strict";
19261
- import_node_crypto9 = require("crypto");
19326
+ import_node_crypto10 = require("crypto");
19262
19327
  import_node_fs51 = require("fs");
19263
19328
  import_node_path48 = require("path");
19264
19329
  import_croner = require("croner");
@@ -19666,6 +19731,7 @@ var init_orchestrator = __esm({
19666
19731
  init_setup_last_error();
19667
19732
  init_request_review();
19668
19733
  init_fork_worktree();
19734
+ init_worktree_runtime();
19669
19735
  init_quota_failover();
19670
19736
  init_adopt();
19671
19737
  init_stack_layers();
@@ -20831,22 +20897,25 @@ var init_orchestrator = __esm({
20831
20897
  "No run script found for this worktree. Add [scripts.run.*] in the worktree\u2019s .sideboard/settings.toml or .conductor/settings.toml (or settings.local.toml on the main repo)."
20832
20898
  );
20833
20899
  }
20834
- const runKey = `${thread.id}:run:${resolvedName}`;
20835
- const existing = this.processes.get(runKey);
20836
- const active = (thread.activeRuns ?? []).find((r) => r.scriptName === resolvedName);
20900
+ const siblings = threadsSharingWorktree(thread.worktreePath);
20901
+ const shared = mergeWorktreeActiveRuns(siblings);
20902
+ const runKey = worktreeRunProcessKey(thread.worktreePath, resolvedName);
20903
+ const existing = this.processes.get(runKey) ?? siblings.map((t) => this.processes.get(`${t.id}:run:${resolvedName}`)).find(Boolean);
20904
+ const active = shared.activeRuns.find((r) => r.scriptName === resolvedName);
20837
20905
  if (existing && active) {
20838
20906
  return { port: active.port, scriptName: resolvedName, ports: active.ports };
20839
20907
  }
20840
20908
  if (!scriptName) {
20841
- const legacy = this.processes.get(`${thread.id}:dev`);
20842
- if (legacy && thread.devPort) {
20843
- return { port: thread.devPort, scriptName: resolvedName, ports: [thread.devPort] };
20909
+ const legacy = this.processes.get(worktreeDevProcessKey(thread.worktreePath)) ?? siblings.map((t) => this.processes.get(`${t.id}:dev`)).find(Boolean);
20910
+ if (legacy && shared.devPort) {
20911
+ return { port: shared.devPort, scriptName: resolvedName, ports: [shared.devPort] };
20844
20912
  }
20845
20913
  }
20846
20914
  const mode = getRunMode(thread.worktreePath, thread.repoPath);
20847
20915
  if (mode === "nonconcurrent") {
20916
+ const here = normalizeWorktreePath(thread.worktreePath);
20848
20917
  for (const t of listThreads()) {
20849
- if (t.id === thread.id) continue;
20918
+ if (normalizeWorktreePath(t.worktreePath) === here) continue;
20850
20919
  const runs = t.activeRuns ?? [];
20851
20920
  if (runs.length > 0 || t.devPort) {
20852
20921
  throw new Error(
@@ -20881,7 +20950,7 @@ var init_orchestrator = __esm({
20881
20950
  });
20882
20951
  const isDefault = scripts.find((s) => s.default)?.name === resolvedName || !scripts.some((s) => s.default) && (resolvedName === "dev" || resolvedName === scripts[0]?.name);
20883
20952
  if (isDefault) {
20884
- this.processes.set(`${thread.id}:dev`, {
20953
+ this.processes.set(worktreeDevProcessKey(thread.worktreePath), {
20885
20954
  kind: "dev",
20886
20955
  pid: handle.pid,
20887
20956
  startedAt,
@@ -20896,13 +20965,14 @@ var init_orchestrator = __esm({
20896
20965
  startedAt
20897
20966
  };
20898
20967
  const nextRuns = [
20899
- ...(thread.activeRuns ?? []).filter((r) => r.scriptName !== resolvedName),
20968
+ ...shared.activeRuns.filter((r) => r.scriptName !== resolvedName),
20900
20969
  run2
20901
20970
  ];
20902
- updateThread(thread.id, {
20903
- activeRuns: nextRuns,
20904
- devPort: isDefault ? handle.port : thread.devPort
20905
- });
20971
+ this.syncWorktreeRuns(
20972
+ thread.worktreePath,
20973
+ nextRuns,
20974
+ isDefault ? handle.port : shared.devPort
20975
+ );
20906
20976
  this.emit({
20907
20977
  type: "dev_server_started",
20908
20978
  threadId: thread.id,
@@ -20911,15 +20981,14 @@ var init_orchestrator = __esm({
20911
20981
  });
20912
20982
  void handle.done.then(() => {
20913
20983
  this.processes.delete(runKey);
20914
- if (isDefault) this.processes.delete(`${thread.id}:dev`);
20915
- const latest = readThread(thread.id);
20916
- const remaining = (latest?.activeRuns ?? []).filter(
20917
- (r) => r.scriptName !== resolvedName
20984
+ if (isDefault) this.processes.delete(worktreeDevProcessKey(thread.worktreePath));
20985
+ const latest = mergeWorktreeActiveRuns(threadsSharingWorktree(thread.worktreePath));
20986
+ const remaining = latest.activeRuns.filter((r) => r.scriptName !== resolvedName);
20987
+ this.syncWorktreeRuns(
20988
+ thread.worktreePath,
20989
+ remaining,
20990
+ isDefault ? null : latest.devPort
20918
20991
  );
20919
- updateThread(thread.id, {
20920
- activeRuns: remaining,
20921
- devPort: isDefault ? null : latest?.devPort ?? null
20922
- });
20923
20992
  this.emit({
20924
20993
  type: "dev_server_stopped",
20925
20994
  threadId: thread.id,
@@ -20930,51 +20999,82 @@ var init_orchestrator = __esm({
20930
20999
  }
20931
21000
  stopDev(threadRef, scriptName) {
20932
21001
  const thread = this.requireThread(threadRef);
21002
+ const siblings = threadsSharingWorktree(thread.worktreePath);
21003
+ const shared = mergeWorktreeActiveRuns(siblings);
20933
21004
  if (scriptName) {
20934
- const runKey = `${thread.id}:run:${scriptName}`;
20935
- const proc = this.processes.get(runKey);
20936
- if (proc) proc.kill();
20937
- this.processes.delete(runKey);
20938
- const remaining = (thread.activeRuns ?? []).filter((r) => r.scriptName !== scriptName);
20939
- const isPrimary = thread.devPort != null && thread.activeRuns?.find((r) => r.scriptName === scriptName)?.port === thread.devPort;
20940
- updateThread(thread.id, {
20941
- activeRuns: remaining,
20942
- devPort: isPrimary ? null : thread.devPort
20943
- });
21005
+ const keys = [
21006
+ worktreeRunProcessKey(thread.worktreePath, scriptName),
21007
+ ...siblings.map((t) => `${t.id}:run:${scriptName}`)
21008
+ ];
21009
+ for (const key of keys) {
21010
+ const proc = this.processes.get(key);
21011
+ if (proc) proc.kill();
21012
+ this.processes.delete(key);
21013
+ }
21014
+ const remaining = shared.activeRuns.filter((r) => r.scriptName !== scriptName);
21015
+ const isPrimary = shared.devPort != null && shared.activeRuns.find((r) => r.scriptName === scriptName)?.port === shared.devPort;
21016
+ this.syncWorktreeRuns(
21017
+ thread.worktreePath,
21018
+ remaining,
21019
+ isPrimary ? null : shared.devPort
21020
+ );
20944
21021
  this.emit({ type: "dev_server_stopped", threadId: thread.id, scriptName });
20945
21022
  return;
20946
21023
  }
20947
21024
  for (const [key, proc] of [...this.processes.entries()]) {
20948
- if (key.startsWith(`${thread.id}:run:`) || key === `${thread.id}:dev`) {
21025
+ if (isWorktreeRunProcessKey(key, thread.worktreePath) || siblings.some((t) => key.startsWith(`${t.id}:run:`) || key === `${t.id}:dev`)) {
20949
21026
  proc.kill();
20950
21027
  this.processes.delete(key);
20951
21028
  }
20952
21029
  }
20953
- updateThread(thread.id, { activeRuns: [], devPort: null });
21030
+ this.syncWorktreeRuns(thread.worktreePath, [], null);
20954
21031
  this.emit({ type: "dev_server_stopped", threadId: thread.id });
20955
21032
  }
21033
+ syncWorktreeRuns(worktreePath, activeRuns, devPort) {
21034
+ for (const sibling of threadsSharingWorktree(worktreePath)) {
21035
+ updateThread(sibling.id, { activeRuns, devPort });
21036
+ }
21037
+ }
20956
21038
  listThreadRunScripts(threadRef) {
20957
21039
  const thread = this.requireThread(threadRef);
20958
21040
  return listRunScripts(thread.worktreePath, thread.repoPath);
20959
21041
  }
20960
21042
  getActiveRuns(threadRef) {
20961
- return this.requireThread(threadRef).activeRuns ?? [];
21043
+ const thread = this.requireThread(threadRef);
21044
+ return mergeWorktreeActiveRuns(threadsSharingWorktree(thread.worktreePath)).activeRuns;
20962
21045
  }
20963
21046
  getSetupLog(threadRef) {
20964
21047
  const thread = this.getThread(threadRef);
20965
21048
  if (!thread) return readSetupLog(threadRef);
20966
- const snap = readSetupLog(thread.id);
20967
- if (snap.running && !this.processes.has(`${thread.id}:setup`)) {
21049
+ const siblingIds = [
21050
+ thread.id,
21051
+ ...threadsSharingWorktree(thread.worktreePath).map((t) => t.id)
21052
+ ];
21053
+ const snap = pickRichestSetupLog([
21054
+ readSetupLog(setupLogKeyForWorktree(thread.worktreePath)),
21055
+ ...[...new Set(siblingIds)].map((id) => readSetupLog(id))
21056
+ ]) ?? readSetupLog(thread.id);
21057
+ if (snap.running && !this.hasWorktreeSetupProcess(thread.worktreePath)) {
20968
21058
  return { ...snap, running: false };
20969
21059
  }
20970
21060
  return snap;
20971
21061
  }
21062
+ hasWorktreeSetupProcess(worktreePath) {
21063
+ if (this.processes.has(worktreeSetupProcessKey(worktreePath))) return true;
21064
+ return threadsSharingWorktree(worktreePath).some(
21065
+ (t) => this.processes.has(`${t.id}:setup`)
21066
+ );
21067
+ }
21068
+ writeSetupLog(threadId, worktreePath, fn) {
21069
+ fn(setupLogKeyForWorktree(worktreePath));
21070
+ fn(threadId);
21071
+ }
20972
21072
  async runSetup(threadRef, opts) {
20973
21073
  const thread = this.requireThread(threadRef);
20974
21074
  this.assertNotGlobal(thread, "Setup");
20975
- const key = `${thread.id}:setup`;
20976
- if (this.processes.has(key)) {
20977
- throw new Error("Setup already running for this thread");
21075
+ const key = worktreeSetupProcessKey(thread.worktreePath);
21076
+ if (this.hasWorktreeSetupProcess(thread.worktreePath)) {
21077
+ throw new Error("Setup already running for this worktree");
20978
21078
  }
20979
21079
  const abort = new AbortController();
20980
21080
  this.processes.set(key, {
@@ -20982,13 +21082,17 @@ var init_orchestrator = __esm({
20982
21082
  startedAt: (/* @__PURE__ */ new Date()).toISOString(),
20983
21083
  kill: () => abort.abort()
20984
21084
  });
20985
- beginSetupLog(thread.id);
21085
+ this.writeSetupLog(thread.id, thread.worktreePath, beginSetupLog);
20986
21086
  this.emit({ type: "setup_started", threadId: thread.id });
20987
21087
  let finished = false;
20988
21088
  const finish = (exitCode, source) => {
20989
21089
  if (finished) return;
20990
21090
  finished = true;
20991
- finishSetupLog(thread.id, exitCode, source);
21091
+ this.writeSetupLog(
21092
+ thread.id,
21093
+ thread.worktreePath,
21094
+ (logKey) => finishSetupLog(logKey, exitCode, source)
21095
+ );
20992
21096
  this.emit({ type: "setup_finished", threadId: thread.id, exitCode });
20993
21097
  };
20994
21098
  try {
@@ -20996,14 +21100,22 @@ var init_orchestrator = __esm({
20996
21100
  thread.repoPath,
20997
21101
  thread.worktreePath,
20998
21102
  (line) => {
20999
- appendSetupLog(thread.id, line);
21103
+ this.writeSetupLog(
21104
+ thread.id,
21105
+ thread.worktreePath,
21106
+ (logKey) => appendSetupLog(logKey, line)
21107
+ );
21000
21108
  this.emit({ type: "setup_output", threadId: thread.id, line });
21001
21109
  },
21002
21110
  { signal: abort.signal }
21003
21111
  );
21004
21112
  if (!setup.ran) {
21005
21113
  const line = "No setup script in .sideboard/settings.toml, .conductor/settings.toml, .cursor/worktrees.json, or script/setup (bin/setup, scripts/setup)";
21006
- appendSetupLog(thread.id, line);
21114
+ this.writeSetupLog(
21115
+ thread.id,
21116
+ thread.worktreePath,
21117
+ (logKey) => appendSetupLog(logKey, line)
21118
+ );
21007
21119
  this.emit({ type: "setup_output", threadId: thread.id, line });
21008
21120
  finish(null, null);
21009
21121
  throw new Error(line);
@@ -21031,8 +21143,14 @@ var init_orchestrator = __esm({
21031
21143
  }
21032
21144
  cancelSetup(threadRef) {
21033
21145
  const thread = this.requireThread(threadRef);
21034
- const proc = this.processes.get(`${thread.id}:setup`);
21035
- if (proc) proc.kill();
21146
+ const keys = [
21147
+ worktreeSetupProcessKey(thread.worktreePath),
21148
+ ...threadsSharingWorktree(thread.worktreePath).map((t) => `${t.id}:setup`)
21149
+ ];
21150
+ for (const key of [...new Set(keys)]) {
21151
+ const proc = this.processes.get(key);
21152
+ if (proc) proc.kill();
21153
+ }
21036
21154
  }
21037
21155
  async applyIntoMain(threadRef, opts) {
21038
21156
  const thread = this.requireThread(threadRef);
@@ -21782,7 +21900,7 @@ init_system_ca();
21782
21900
  var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
21783
21901
  var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
21784
21902
  var import_zod9 = require("zod");
21785
- var import_node_crypto12 = require("crypto");
21903
+ var import_node_crypto13 = require("crypto");
21786
21904
  var import_node_path52 = require("path");
21787
21905
  init_orchestrator();
21788
21906
  init_worktree();
@@ -22209,7 +22327,7 @@ async function createGitHubIssue(input, opts) {
22209
22327
  init_fetch();
22210
22328
 
22211
22329
  // src/integrations/linear-oauth.ts
22212
- var import_node_crypto10 = require("crypto");
22330
+ var import_node_crypto11 = require("crypto");
22213
22331
  var import_node_http = require("http");
22214
22332
  init_app_settings();
22215
22333
  init_fetch();
@@ -25192,7 +25310,7 @@ init_worktree();
25192
25310
  init_paths();
25193
25311
 
25194
25312
  // src/board/board-pins.ts
25195
- var import_node_crypto11 = require("crypto");
25313
+ var import_node_crypto12 = require("crypto");
25196
25314
  var import_node_fs54 = require("fs");
25197
25315
  var import_node_path50 = require("path");
25198
25316
  init_paths();
@@ -26041,7 +26159,7 @@ async function startMcpServer() {
26041
26159
  const ident = issue?.identifier ?? ref.trim();
26042
26160
  const attachments = issue ? [
26043
26161
  {
26044
- id: (0, import_node_crypto12.randomUUID)(),
26162
+ id: (0, import_node_crypto13.randomUUID)(),
26045
26163
  name: issue.identifier,
26046
26164
  kind: "issue",
26047
26165
  content: [
@@ -38,7 +38,7 @@ import {
38
38
  syncBoardPins,
39
39
  updateSchedule,
40
40
  waitForDetachedJob
41
- } from "../chunk-VRPPFKAO.js";
41
+ } from "../chunk-3IGCU4AT.js";
42
42
  import "../chunk-YWI3IBP2.js";
43
43
  import {
44
44
  applySystemCaEnv,
@@ -48,7 +48,7 @@ import {
48
48
  materializeSystemCaBundle,
49
49
  sideboardMcpProfile,
50
50
  trustSystemCertificates
51
- } from "../chunk-6H2XPPPR.js";
51
+ } from "../chunk-5DY2QWVN.js";
52
52
  import {
53
53
  GLOBAL_WORKSPACE_ID,
54
54
  isCloudCoordinatorThread,
@@ -9,9 +9,9 @@ import {
9
9
  resolveSendFollowUp,
10
10
  startOrchestration,
11
11
  waitForPidExit
12
- } from "./chunk-VRPPFKAO.js";
12
+ } from "./chunk-3IGCU4AT.js";
13
13
  import "./chunk-YWI3IBP2.js";
14
- import "./chunk-6H2XPPPR.js";
14
+ import "./chunk-5DY2QWVN.js";
15
15
  import "./chunk-6YTI2HBG.js";
16
16
  import "./chunk-3OHR73VK.js";
17
17
  import "./chunk-Y4MIXGPA.js";
@@ -7,9 +7,9 @@ import {
7
7
  resolveSendFollowUp,
8
8
  startOrchestration,
9
9
  waitForPidExit
10
- } from "./chunk-NY366OEZ.js";
10
+ } from "./chunk-NXXJBRWQ.js";
11
11
  import "./chunk-DJU54RYW.js";
12
- import "./chunk-2X6RGKLI.js";
12
+ import "./chunk-NWIBA5CP.js";
13
13
  import "./chunk-HZTHWU6A.js";
14
14
  import "./chunk-S4QCBBXS.js";
15
15
  import "./chunk-6K64FJDD.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideboard-ai/core",
3
- "version": "0.1.194",
3
+ "version": "0.1.196",
4
4
  "description": "Sideboard core — orchestration, agents, git worktrees, MCP server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",