@sideboard-ai/core 0.1.173 → 0.1.175

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/{abletime-PCLL36HW.js → abletime-BFIDZR3O.js} +2 -2
  2. package/dist/{abletime-7VW4EGPT.js → abletime-INEHQH6K.js} +2 -2
  3. package/dist/agents/cursor-runner.cjs +91 -62
  4. package/dist/agents/cursor-runner.js +1 -1
  5. package/dist/{agents-CTWLBPCV.js → agents-2W7LP7JR.js} +6 -6
  6. package/dist/{agents-7UTRNLXQ.js → agents-AWSFDB47.js} +7 -7
  7. package/dist/{chunk-QYZYDO3F.js → chunk-7JIYKYLL.js} +26 -5
  8. package/dist/{chunk-PXNOT6NV.js → chunk-7O53GXTA.js} +26 -5
  9. package/dist/{chunk-M267JPEA.js → chunk-AN3THU7F.js} +1 -1
  10. package/dist/{chunk-AQPVBVJE.js → chunk-BBNUL4IE.js} +1 -1
  11. package/dist/{chunk-LZ6QMEQC.js → chunk-HVIEYTUK.js} +1 -1
  12. package/dist/{chunk-XD2BAANL.js → chunk-IEEAVWAP.js} +6 -6
  13. package/dist/{chunk-WE34LOLO.js → chunk-JIWRBNSO.js} +22 -21
  14. package/dist/{chunk-ELBYOGVA.js → chunk-N7WZ6NIN.js} +10 -1
  15. package/dist/{chunk-2RM6BZQ2.js → chunk-NA7P3SZL.js} +4 -4
  16. package/dist/{chunk-XXIH6XYR.js → chunk-NQTKRAUF.js} +167 -35
  17. package/dist/{chunk-3F7AXVIL.js → chunk-QTJ2ERA6.js} +6 -6
  18. package/dist/{chunk-SKKEJZEX.js → chunk-RCICB4OM.js} +19 -18
  19. package/dist/{chunk-CMJ2FBBV.js → chunk-RE2YWFUQ.js} +1 -1
  20. package/dist/{chunk-234EKD2F.js → chunk-TNOLCU5B.js} +4 -4
  21. package/dist/{chunk-6GN5WPYZ.js → chunk-VKQGAWHY.js} +10 -1
  22. package/dist/{chunk-S42XV45P.js → chunk-Y4MIXGPA.js} +1 -1
  23. package/dist/{chunk-6X6KMUI2.js → chunk-ZXHV3NHY.js} +225 -96
  24. package/dist/{connected-teams-DBWAMP7G.js → connected-teams-ON2KIKQX.js} +3 -3
  25. package/dist/{connected-teams-WGONUQOF.js → connected-teams-WOYCH7FR.js} +3 -3
  26. package/dist/{coordinator-prompt-7CTI6HRH.js → coordinator-prompt-7OHKB5WV.js} +2 -2
  27. package/dist/{coordinator-prompt-PM6MPYYB.js → coordinator-prompt-XCQCGUED.js} +2 -2
  28. package/dist/{global-workspace-CMYSFRCM.js → global-workspace-KPROJ54C.js} +2 -2
  29. package/dist/{global-workspace-CRJ6ZVIY.js → global-workspace-WSQNEALF.js} +2 -2
  30. package/dist/index.cjs +600 -386
  31. package/dist/index.d.cts +49 -8
  32. package/dist/index.d.ts +49 -8
  33. package/dist/index.js +74 -28
  34. package/dist/mcp/run-stdio.cjs +795 -581
  35. package/dist/mcp/run-stdio.js +75 -26
  36. package/dist/{oauth-A7XXI2TM.js → oauth-6ZQ4Q4XN.js} +2 -2
  37. package/dist/{oauth-YJBAURIJ.js → oauth-O7UGLZOY.js} +2 -2
  38. package/dist/{orchestrator-PEOUSLAY.js → orchestrator-PDEU75EE.js} +8 -8
  39. package/dist/{orchestrator-QBB2RELD.js → orchestrator-QSNGJ2ER.js} +7 -7
  40. package/dist/{workspaces-L73MCDFA.js → workspaces-P66DGCZE.js} +2 -2
  41. package/dist/{workspaces-UYSD2STS.js → workspaces-TEBTNS2M.js} +2 -2
  42. package/dist/{worktree-SQD3DBYC.js → worktree-LC4VRWDM.js} +1 -1
  43. package/dist/{worktree-WVEDT3FM.js → worktree-UTDBQXSS.js} +1 -1
  44. package/package.json +1 -1
@@ -33,7 +33,7 @@ import {
33
33
  summarizeTurnStderr,
34
34
  toolDescription,
35
35
  turnFailChatText
36
- } from "./chunk-6X6KMUI2.js";
36
+ } from "./chunk-ZXHV3NHY.js";
37
37
  import {
38
38
  extractPresentedPlan,
39
39
  readPlanFile,
@@ -64,7 +64,7 @@ import {
64
64
  stageAbsolutePathsAsAttachments,
65
65
  stageBuffersAsAttachments,
66
66
  syncWorkspacesFromThreads
67
- } from "./chunk-234EKD2F.js";
67
+ } from "./chunk-TNOLCU5B.js";
68
68
  import {
69
69
  addPrStackLayer,
70
70
  allocateTeamName,
@@ -114,7 +114,7 @@ import {
114
114
  worktreeDisplayLabelForGroup,
115
115
  worktreeNameFromPath,
116
116
  worktreeSlugForTicket
117
- } from "./chunk-PXNOT6NV.js";
117
+ } from "./chunk-7O53GXTA.js";
118
118
  import {
119
119
  ATTACHMENTS_DIR,
120
120
  DETACHED_JOBS_DIR,
@@ -401,7 +401,7 @@ async function continueSourceThread(threadId, prompt) {
401
401
  await continueOnReply(threadId, prompt);
402
402
  return;
403
403
  }
404
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-QBB2RELD.js");
404
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-QSNGJ2ER.js");
405
405
  await getOrchestrator2().send(threadId, prompt);
406
406
  } catch {
407
407
  }
@@ -794,9 +794,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
794
794
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
795
795
  );
796
796
  }
797
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-CRJ6ZVIY.js");
797
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-WSQNEALF.js");
798
798
  if (isGlobalThread2(thread)) {
799
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-PM6MPYYB.js");
799
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-XCQCGUED.js");
800
800
  ensureGlobalCoordinatorCwd2(
801
801
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
802
802
  );
@@ -1355,7 +1355,7 @@ function buildSessionSeed(messages, opts) {
1355
1355
  for (let i = blocks.length - 1; i >= 0; i--) {
1356
1356
  if (keep[i]) continue;
1357
1357
  const next = used + blocks[i].length + 2;
1358
- if (next > maxChars && used > 0) break;
1358
+ if (next > maxChars && used > 0) continue;
1359
1359
  keep[i] = true;
1360
1360
  used = next;
1361
1361
  }
@@ -2683,7 +2683,7 @@ function jobAlive(pid) {
2683
2683
  }
2684
2684
  function processGroupAlive(pgid) {
2685
2685
  if (process.platform === "win32") return false;
2686
- if (!Number.isInteger(pgid) || pgid <= 0) return false;
2686
+ if (!Number.isInteger(pgid) || pgid <= 1) return false;
2687
2687
  try {
2688
2688
  process.kill(-pgid, 0);
2689
2689
  return true;
@@ -2726,7 +2726,7 @@ function listRunningDetachedJobs(worktreePath) {
2726
2726
  for (const id of ids) {
2727
2727
  const dir = resolveJobDir(root, id);
2728
2728
  const pid = readIntFile(join11(dir, "pid"));
2729
- if (pid != null && jobAlive(pid)) running.push(id);
2729
+ if (jobTreeAlive(pid)) running.push(id);
2730
2730
  }
2731
2731
  return running.sort();
2732
2732
  }
@@ -3555,7 +3555,7 @@ async function createThread(input, _onSetupLine) {
3555
3555
  let sourceIsFork = false;
3556
3556
  if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
3557
3557
  if (isAbleTimeConnected() && getIssueSource() === "abletime") {
3558
- const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-PCLL36HW.js");
3558
+ const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-BFIDZR3O.js");
3559
3559
  const task = await ensureAbleTimeTask({
3560
3560
  title: title?.trim() || "Untitled work",
3561
3561
  description: input.prompt?.trim() || void 0
@@ -4063,7 +4063,7 @@ async function adoptThread(input) {
4063
4063
  messages: input.messages ?? []
4064
4064
  });
4065
4065
  writeThread(thread);
4066
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-L73MCDFA.js");
4066
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-P66DGCZE.js");
4067
4067
  await ensureWorkspace2(repoPath);
4068
4068
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-N5X5I422.js");
4069
4069
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -6339,7 +6339,7 @@ function formatScheduledPrompt(name, prompt) {
6339
6339
  ${prompt}`;
6340
6340
  }
6341
6341
  async function defaultDeps() {
6342
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-QBB2RELD.js");
6342
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-QSNGJ2ER.js");
6343
6343
  const orch = getOrchestrator2();
6344
6344
  return {
6345
6345
  findThread: (id) => findThreadByRef(id),
@@ -7127,9 +7127,10 @@ var Orchestrator = class {
7127
7127
  ts: (/* @__PURE__ */ new Date()).toISOString()
7128
7128
  });
7129
7129
  thread = this.requireThread(threadId);
7130
+ const gitPrompt = expandCanonicalGitRequest(prompt);
7130
7131
  const { agentPrompt: expandedPrompt } = expandComposerPrompt(
7131
7132
  thread.worktreePath,
7132
- prompt,
7133
+ gitPrompt,
7133
7134
  {
7134
7135
  attachments: sentAttachments ?? thread.attachments
7135
7136
  }
@@ -7171,13 +7172,13 @@ var Orchestrator = class {
7171
7172
  artifactReminder,
7172
7173
  longRunningReminder
7173
7174
  ].filter(Boolean).join("\n\n") || void 0;
7174
- const prGateDirective = thread.agent !== "brightsy" && !isOrchestratorThread(thread) && mentionsPrGoal(expandedPrompt) ? formatPrGateDirective() : null;
7175
+ const prGateDirective = thread.agent !== "brightsy" && !isOrchestratorThread(thread) && mentionsPrGoal(prompt) ? formatPrGateDirective() : null;
7175
7176
  const agentPrompt = [
7176
7177
  thread.planMode ? PLAN_MODE_INSTRUCTION : null,
7177
7178
  orchestrationReminder,
7178
7179
  prGateDirective,
7179
7180
  slackReplyContext,
7180
- expandCanonicalGitRequest(expandedPrompt)
7181
+ expandedPrompt
7181
7182
  ].filter(Boolean).join("\n\n");
7182
7183
  if (thread.attachments.length > 0) {
7183
7184
  updateThread(threadId, { attachments: [] });
@@ -8424,7 +8425,7 @@ var Orchestrator = class {
8424
8425
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
8425
8426
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
8426
8427
  try {
8427
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-L73MCDFA.js");
8428
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-P66DGCZE.js");
8428
8429
  await ensureWorkspace2(thread.repoPath);
8429
8430
  } catch {
8430
8431
  }
@@ -8478,7 +8479,7 @@ var Orchestrator = class {
8478
8479
  `Cowboy checkout missing: ${thread.worktreePath}. Re-add the project folder, then restore.`
8479
8480
  );
8480
8481
  }
8481
- const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-SQD3DBYC.js");
8482
+ const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-LC4VRWDM.js");
8482
8483
  const slug = thread.worktreePath.split("/").pop();
8483
8484
  const dest = thread.worktreePath;
8484
8485
  await withRepoGitLock(thread.repoPath, async () => {
@@ -8588,7 +8589,7 @@ async function startOrchestration(opts) {
8588
8589
  sourceRef: "default",
8589
8590
  ...createOpts
8590
8591
  }).catch(async () => {
8591
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-SQD3DBYC.js");
8592
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-LC4VRWDM.js");
8592
8593
  const repo = await resolveRepoRoot2(repoPath);
8593
8594
  const def = await resolveDefaultBranch2(repo);
8594
8595
  return orch.createThread({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  httpFetch
3
- } from "./chunk-ELBYOGVA.js";
3
+ } from "./chunk-N7WZ6NIN.js";
4
4
  import {
5
5
  getAbleTimeAccessToken,
6
6
  getAbleTimeHost,
@@ -7,7 +7,7 @@ import {
7
7
  resolveRepoRoot,
8
8
  takenSlugsFromThread,
9
9
  teamSlugFromName
10
- } from "./chunk-PXNOT6NV.js";
10
+ } from "./chunk-7O53GXTA.js";
11
11
  import {
12
12
  ATTACHMENTS_DIR,
13
13
  attachmentsGitignoreBody
@@ -345,7 +345,7 @@ var COORDINATOR_TOOL_PLAYBOOK = [
345
345
  "Workspaces:",
346
346
  "- add_workspace / remove_workspace \u2014 register or unregister a git repo",
347
347
  "Worktree threads (chats):",
348
- "- create_thread \u2014 create a worktree + chat from branch | pr | ticket (appears on Home). Do not create a second worktree for a ticket, PR, or named branch that already has one \u2014 that call returns the live thread (alreadyStarted=true). Creating from the default branch still opens a new isolated worktree. Pass repoPath + parentThreadId; omit agent and model to use Sideboard Account defaults (Settings \u2192 Default agent, model & effort). If the repo has a setup script, Sideboard runs it in the background (does not block send_to_thread). If you are Codex, do not set agent=codex (nested Codex deadlocks)",
348
+ "- create_thread \u2014 create a worktree + chat from branch | pr | ticket (appears on Home). Do not create a second worktree for a ticket, PR, or named branch that already has one \u2014 that call returns the live thread (alreadyStarted=true). Creating from the default branch still opens a new isolated worktree. Pass repoPath + parentThreadId; omit agent and model so Sideboard applies Settings \u2192 Default agent, model & effort (never pass your own agent or agent=cursor). If the repo has a setup script, Sideboard runs it in the background (does not block send_to_thread). Nested Codex (you are Codex and the child is Codex) deadlocks \u2014 omit agent; Sideboard coerces that case",
349
349
  "- start_board_card \u2014 same as create_thread for a ticket/PR/named branch (attaches issue text when resolvable). Then send_to_thread.",
350
350
  "- fork_worktree \u2014 fork a worktree chat into a NEW git worktree + chat (transcript attached); optional agent; leave model unset (Auto) unless you have a reason. Not for orchestration chats.",
351
351
  "- fork_chat \u2014 fork a worktree chat (same worktree tab) OR a Global orchestration chat (new orchestration tab); optional agent; leave model unset (Auto) unless you have a reason. Remote coordinators: use this to continue another orchestration chat on a different agent after session limits.",
@@ -486,8 +486,8 @@ function ensureGlobalCoordinatorCwd(opts) {
486
486
  "",
487
487
  "When creating threads, pass `repoPath` from `list_workspaces` (or the path you just registered).",
488
488
  orchId ? `Pass parentThreadId="${orchId}" (or omit it). Never invent another parentThreadId.` : "Pass `parentThreadId` for children (this chat's id from the turn reminder).",
489
- "Omit `agent` / `model` on `create_thread` unless you have a reason to override Account defaults.",
490
- "Never pass `agent=codex` when you yourself are Codex \u2014 nested Codex deadlocks on shared ~/.codex locks. Omit agent (Account default) or use cursor/claude.",
489
+ "Omit `agent` / `model` on `create_thread`. Sideboard applies Settings \u2192 Default agent, model & effort. Do not pass your own agent or `agent=cursor` \u2014 those are ignored.",
490
+ "Never pass `agent=codex` when you yourself are Codex \u2014 nested Codex deadlocks on shared ~/.codex locks. Omit agent; Sideboard applies Account defaults (and coerces only that nested-Codex case).",
491
491
  "Typical flow (Home board): list_board \u2192 create_thread (sourceType=ticket|pr|branch) \u2192 send_to_thread \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft \u2192 wait_for_turn. Merge only if the user explicitly asked (`ask_git` merge).",
492
492
  "Typical flow (branch / explicit source): list_workspaces \u2192 list_branches|list_prs|list_issues \u2192 create_thread \u2192 send_to_thread \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
493
493
  "Typical flow (find work): list_workspaces \u2192 pick repo(s) matching account / project context \u2192 Sideboard list_issues / linear_* (tickets) or list_prs(queue=review) (reviews) \u2192 show the options. Never wait on Claude Linear MCP. Only create_thread + send_to_thread when they asked to start (e.g. \u201Cfind me work and start it\u201D) \u2014 then wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
@@ -3,17 +3,26 @@
3
3
 
4
4
  // src/http/fetch.ts
5
5
  var injected = null;
6
+ var TLS_ISSUER_RE = /UNABLE_TO_GET_ISSUER_CERT|UNABLE_TO_VERIFY_LEAF_SIGNATURE|SELF_SIGNED_CERT_IN_CHAIN/i;
7
+ var TLS_ISSUER_HINT = " \u2014 Node rejected the TLS certificate (corporate VPN/proxy CA). Desktop Linear can still work; reconnecting the API key will not fix this.";
8
+ function tlsIssuerHint(code, message) {
9
+ const text = `${code ?? ""} ${message}`;
10
+ return TLS_ISSUER_RE.test(text) ? TLS_ISSUER_HINT : "";
11
+ }
6
12
  function formatFetchError(err, url) {
7
13
  if (!(err instanceof Error)) return `${String(err)} (${url})`;
8
14
  const cause = err.cause;
9
15
  let detail = "";
16
+ let hint = tlsIssuerHint(void 0, err.message);
10
17
  if (cause instanceof Error) {
11
18
  const code = typeof cause.code === "string" ? cause.code : void 0;
12
19
  detail = code ? ` [${code}: ${cause.message}]` : ` [${cause.message}]`;
20
+ hint = tlsIssuerHint(code, `${err.message} ${cause.message}`) || hint;
13
21
  } else if (cause != null) {
14
22
  detail = ` [${String(cause)}]`;
23
+ hint = tlsIssuerHint(void 0, String(cause)) || hint;
15
24
  }
16
- return `${err.message}${detail} (${url})`;
25
+ return `${err.message}${detail} (${url})${hint}`;
17
26
  }
18
27
  async function httpFetch(input, init) {
19
28
  const url = typeof input === "string" ? input : input.href;
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  formatFetchError
5
- } from "./chunk-6GN5WPYZ.js";
5
+ } from "./chunk-VKQGAWHY.js";
6
6
 
7
7
  // src/brightsy/config.ts
8
8
  import { existsSync, readFileSync, writeFileSync } from "fs";