@sideboard-ai/core 0.1.156 → 0.1.157

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 (27) hide show
  1. package/dist/{abletime-JSTJLXAW.js → abletime-BEIDJG7W.js} +5 -1
  2. package/dist/{abletime-H7LPGIP2.js → abletime-GWZE6OYM.js} +5 -1
  3. package/dist/{agents-2FTZAXO3.js → agents-C55LAEUR.js} +2 -2
  4. package/dist/{agents-IY4CSPWV.js → agents-LCDXN2B2.js} +2 -2
  5. package/dist/{chunk-TI6UMRWK.js → chunk-4I4VKAPZ.js} +3 -2
  6. package/dist/{chunk-MSFPM5VK.js → chunk-CVR4RJ6G.js} +3 -2
  7. package/dist/{chunk-JOK4XWBG.js → chunk-DVJBO3M7.js} +87 -3
  8. package/dist/{chunk-7EIPEPAH.js → chunk-GWEEGE6L.js} +119 -10
  9. package/dist/{chunk-UA3YZKRX.js → chunk-KQ4JOGUH.js} +19 -3
  10. package/dist/{chunk-FDCFXMDG.js → chunk-N27GVFZY.js} +87 -3
  11. package/dist/{chunk-OLE2BLIX.js → chunk-SUCJAWV4.js} +90 -9
  12. package/dist/{chunk-XLU7DXHH.js → chunk-TIJ6QVX5.js} +47 -3
  13. package/dist/{coordinator-prompt-D2FHU5IZ.js → coordinator-prompt-26IJU2AV.js} +1 -1
  14. package/dist/{coordinator-prompt-UZDNIVP7.js → coordinator-prompt-AM47SATF.js} +1 -1
  15. package/dist/{global-workspace-5WZVSWNT.js → global-workspace-5BIW26YR.js} +1 -1
  16. package/dist/{global-workspace-MR75BDBY.js → global-workspace-QV7CC7SK.js} +1 -1
  17. package/dist/index.cjs +951 -379
  18. package/dist/index.d.cts +128 -3
  19. package/dist/index.d.ts +128 -3
  20. package/dist/index.js +590 -252
  21. package/dist/mcp/run-stdio.cjs +799 -320
  22. package/dist/mcp/run-stdio.js +501 -199
  23. package/dist/{orchestrator-G4WKJG5Y.js → orchestrator-BUH3LJLL.js} +3 -3
  24. package/dist/{orchestrator-LXO2CDOG.js → orchestrator-KQO4MXBI.js} +3 -3
  25. package/dist/{workspaces-RP32AW6X.js → workspaces-NYSM2EPX.js} +1 -1
  26. package/dist/{workspaces-HO4EQNNM.js → workspaces-Q2VCHIAS.js} +1 -1
  27. package/package.json +1 -1
@@ -226,6 +226,27 @@ function labelsOf(record) {
226
226
  return rec ? firstString(rec, ["name", "title", "label"]) : "";
227
227
  }).filter(Boolean);
228
228
  }
229
+ function commentsOf(record) {
230
+ const raw = record.comments ?? record.notes ?? record.discussion;
231
+ const out = [];
232
+ for (const item of asList(raw)) {
233
+ const rec = asRecord2(item);
234
+ if (!rec) continue;
235
+ const body = firstString(rec, ["body", "text", "comment", "content", "message"]);
236
+ if (!body) continue;
237
+ const user = firstString(asRecord2(rec.user) ?? asRecord2(rec.author), ["name", "display_name"]) || firstString(rec, ["user_name", "author"]);
238
+ const comment = { body };
239
+ const id = firstString(rec, ["id", "comment_id"]);
240
+ if (id) comment.id = id;
241
+ const url = firstString(rec, ["url", "permalink"]);
242
+ if (url) comment.url = url;
243
+ const createdAt = firstString(rec, ["created_at", "createdAt", "created"]);
244
+ if (createdAt) comment.createdAt = createdAt;
245
+ if (user) comment.user = user;
246
+ out.push(comment);
247
+ }
248
+ return out;
249
+ }
229
250
  function assigneeOf(record) {
230
251
  const nested = firstRecord(record, ["assignee", "assigned_to", "user", "owner"]);
231
252
  const name = firstString(nested, ["name", "display_name", "full_name", "email"]) || firstString(record, ["assignee_name", "assigneeName"]);
@@ -259,7 +280,8 @@ function mapAbleTimeTask(raw, host) {
259
280
  projectId: firstString(nested, ["project_id", "projectId"]) || firstString(asRecord2(nested.project), ["id"]) || void 0,
260
281
  categoryId: firstString(nested, ["category_id", "categoryId"]) || firstString(asRecord2(nested.category), ["id"]) || void 0,
261
282
  assignee: assigneeOf(nested),
262
- labels: labelsOf(nested)
283
+ labels: labelsOf(nested),
284
+ comments: commentsOf(nested)
263
285
  };
264
286
  }
265
287
  function toAbleTimeIssueInfo(task) {
@@ -352,16 +374,24 @@ async function createAbleTimeTask(input, opts) {
352
374
  if (!title) throw new Error("AbleTime task title is required");
353
375
  const project = await resolveAbleTimeProject(input.projectId, opts);
354
376
  const category = resolveAbleTimeCategory(project, input.categoryId);
377
+ const parent = input.parent?.trim();
378
+ const descriptionParts = [
379
+ parent ? `Spin-off of ${parent}.` : null,
380
+ input.description?.trim() || null
381
+ ].filter(Boolean);
355
382
  const raw = await callAbleTimeTool(
356
383
  "create_task",
357
384
  {
358
385
  title,
359
- description: input.description?.trim() || void 0,
386
+ description: descriptionParts.join("\n\n") || void 0,
360
387
  state: input.state ?? "todo",
361
388
  project: project.id,
362
389
  project_id: project.id,
363
390
  category: category?.id,
364
- category_id: category?.id
391
+ category_id: category?.id,
392
+ parent,
393
+ parent_id: parent,
394
+ related_task_id: parent
365
395
  },
366
396
  opts
367
397
  );
@@ -369,6 +399,58 @@ async function createAbleTimeTask(input, opts) {
369
399
  if (!task) throw new Error("AbleTime create_task returned no task");
370
400
  return task;
371
401
  }
402
+ async function commentAbleTimeTask(input, opts) {
403
+ const id = input.id.trim();
404
+ const body = input.body.trim();
405
+ if (!id) throw new Error("AbleTime task id is required");
406
+ if (!body) throw new Error("AbleTime comment body is required");
407
+ const raw = await callAbleTimeTool(
408
+ "create_comment",
409
+ { id, task_id: id, task: id, body, comment: body, text: body },
410
+ opts
411
+ );
412
+ const rec = asRecord2(raw);
413
+ return {
414
+ id: rec ? firstString(rec, ["id", "comment_id"]) || void 0 : void 0,
415
+ body: rec ? firstString(rec, ["body", "text", "comment"]) || body : body
416
+ };
417
+ }
418
+ async function updateAbleTimeTask(input, opts) {
419
+ const id = input.id.trim();
420
+ if (!id) throw new Error("AbleTime task id is required");
421
+ const title = input.title?.trim();
422
+ const description = input.description;
423
+ const state = input.state?.trim();
424
+ if (!title && description === void 0 && !state) {
425
+ throw new Error("abletime_update_task needs at least one of title, description, state");
426
+ }
427
+ if (state) {
428
+ await callAbleTimeTool(
429
+ "set_task_state",
430
+ { id, task_id: id, task: id, state },
431
+ opts
432
+ ).catch(async () => {
433
+ await callAbleTimeTool(
434
+ "update_task",
435
+ { id, task_id: id, title, description, state },
436
+ opts
437
+ );
438
+ });
439
+ }
440
+ if (title || description !== void 0) {
441
+ await callAbleTimeTool(
442
+ "update_task",
443
+ {
444
+ id,
445
+ task_id: id,
446
+ ...title ? { title } : {},
447
+ ...description !== void 0 ? { description } : {}
448
+ },
449
+ opts
450
+ );
451
+ }
452
+ return getAbleTimeTask(id, opts);
453
+ }
372
454
  async function resolveAbleTimeProject(projectId, opts) {
373
455
  const wanted = projectId?.trim().toLowerCase();
374
456
  const fromOrientation = (await getAbleTimeOrientation(opts).catch(() => null))?.projects ?? [];
@@ -457,6 +539,8 @@ export {
457
539
  searchAbleTimeTasks,
458
540
  getAbleTimeTask,
459
541
  createAbleTimeTask,
542
+ commentAbleTimeTask,
543
+ updateAbleTimeTask,
460
544
  ensureAbleTimeTask,
461
545
  listAbleTimeAssignedIssues,
462
546
  verifyAbleTimeConnection
@@ -33,7 +33,7 @@ import {
33
33
  summarizeTurnStderr,
34
34
  toolDescription,
35
35
  turnFailChatText
36
- } from "./chunk-UA3YZKRX.js";
36
+ } from "./chunk-KQ4JOGUH.js";
37
37
  import {
38
38
  extractPresentedPlan,
39
39
  readPlanFile,
@@ -67,7 +67,7 @@ import {
67
67
  stageAbsolutePathsAsAttachments,
68
68
  stageBuffersAsAttachments,
69
69
  syncWorkspacesFromThreads
70
- } from "./chunk-TI6UMRWK.js";
70
+ } from "./chunk-4I4VKAPZ.js";
71
71
  import {
72
72
  addPrStackLayer,
73
73
  allocateTeamName,
@@ -147,11 +147,13 @@ import {
147
147
  childEnvWithAppSettings,
148
148
  getIssueSource,
149
149
  isAbleTimeConnected,
150
+ isLinearConnected,
150
151
  isSecureFileEncrypted,
151
152
  loadAppSettings,
152
153
  orchestrationQuotaFallbackAgent,
153
154
  orchestrationQuotaOnLimit,
154
155
  readSecureJson,
156
+ resolveEffectiveIssueSource,
155
157
  resolveNewThreadOptions,
156
158
  resolveThreadDefaults,
157
159
  resolveVaultKey,
@@ -392,7 +394,7 @@ async function continueSourceThread(threadId, prompt) {
392
394
  await continueOnReply(threadId, prompt);
393
395
  return;
394
396
  }
395
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-LXO2CDOG.js");
397
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-KQO4MXBI.js");
396
398
  await getOrchestrator2().send(threadId, prompt);
397
399
  } catch {
398
400
  }
@@ -733,9 +735,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
733
735
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
734
736
  );
735
737
  }
736
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-MR75BDBY.js");
738
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-QV7CC7SK.js");
737
739
  if (isGlobalThread2(thread)) {
738
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-UZDNIVP7.js");
740
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-AM47SATF.js");
739
741
  ensureGlobalCoordinatorCwd2(
740
742
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
741
743
  );
@@ -3073,7 +3075,7 @@ async function createThread(input, _onSetupLine) {
3073
3075
  let sourceIsFork = false;
3074
3076
  if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
3075
3077
  if (isAbleTimeConnected() && getIssueSource() === "abletime") {
3076
- const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-JSTJLXAW.js");
3078
+ const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-BEIDJG7W.js");
3077
3079
  const task = await ensureAbleTimeTask({
3078
3080
  title: title?.trim() || "Untitled work",
3079
3081
  description: input.prompt?.trim() || void 0
@@ -3569,7 +3571,7 @@ async function adoptThread(input) {
3569
3571
  messages: input.messages ?? []
3570
3572
  });
3571
3573
  writeThread(thread);
3572
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-HO4EQNNM.js");
3574
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-Q2VCHIAS.js");
3573
3575
  await ensureWorkspace2(repoPath);
3574
3576
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-N5X5I422.js");
3575
3577
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -5372,6 +5374,66 @@ function formatWorktreeDirective(thread, opts) {
5372
5374
  function formatWorktreeReminder() {
5373
5375
  return "Sideboard worktree: stay in this cwd for all file and git work. Push and open PRs against origin, never upstream. Do not edit the main repo checkout. If a goal is given (Greptile 5/5, CI green), watch-fix-push until it lands \u2014 do not watch after every push.";
5374
5376
  }
5377
+ var GITHUB_TICKET_REF = /^(?:#?\d+|gh-\d+)$/i;
5378
+ var KEYED_TICKET_REF = /^(?:[A-Z][A-Z0-9]{0,9}-\d+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;
5379
+ function issueTicketFromThread(thread, preferredSource = "github") {
5380
+ if (thread?.sourceType !== "ticket") return null;
5381
+ const ref = thread.sourceRef?.trim() ?? "";
5382
+ if (!ref) return null;
5383
+ if (/github\.com\/[^/]+\/[^/]+\/issues\/\d+/i.test(ref) || GITHUB_TICKET_REF.test(ref)) {
5384
+ return { id: ref, provider: "github" };
5385
+ }
5386
+ if (KEYED_TICKET_REF.test(ref)) {
5387
+ return { id: ref, provider: preferredSource === "github" ? "linear" : preferredSource };
5388
+ }
5389
+ return { id: ref, provider: preferredSource };
5390
+ }
5391
+ function formatIssueToolsDirective(opts) {
5392
+ const github = opts.github !== false;
5393
+ if (!opts.linear && !opts.abletime && !github) return null;
5394
+ const lines = [
5395
+ "Issue tracking (Settings \u2192 Issues / Git \u2014 already signed in):",
5396
+ "- Use Sideboard `linear_*` / `github_*` / `abletime_*` tools. Do not call Claude Linear MCP, vendor GitHub MCP, or any other vendor issue MCP \u2014 those need a separate login and hang. If a vendor namespace shows needsAuth, ignore it and keep going with Sideboard tools."
5397
+ ];
5398
+ if (opts.linear) {
5399
+ lines.push(
5400
+ "- Linear: `linear_get_issue` (comments), `linear_comment`, `linear_update_issue` (state), `linear_create_issue` (pass `parent` for spin-offs; call `linear_list_teams` first). Scope errors: reconnect Linear in Settings \u2192 Issues."
5401
+ );
5402
+ }
5403
+ if (github) {
5404
+ lines.push(
5405
+ "- GitHub: `github_get_issue` (comments), `github_comment`, `github_update_issue` (state open|closed), `github_create_issue` (pass `parent` for spin-offs). Uses Account `gh`."
5406
+ );
5407
+ }
5408
+ if (opts.abletime) {
5409
+ lines.push(
5410
+ "- AbleTime: `abletime_get_task` (comments), `abletime_comment`, `abletime_update_task` (state), `abletime_create_task` (pass `parent` for spin-offs; `abletime_list_projects` if needed)."
5411
+ );
5412
+ }
5413
+ lines.push(
5414
+ "- Do not ask the user to `claude mcp login` for tickets. Reconnect the Account source in Settings \u2192 Issues (or Git for `gh`)."
5415
+ );
5416
+ const ticket = opts.ticketId?.trim();
5417
+ if (ticket) {
5418
+ const provider = opts.ticketProvider ?? "linear";
5419
+ lines.push(
5420
+ `- This thread's ticket is \`${ticket}\` (${provider}). Use that id for get/comment/update; pass it as \`parent\` on spin-offs.`
5421
+ );
5422
+ }
5423
+ return lines.join("\n");
5424
+ }
5425
+ function formatIssueToolsReminder(opts) {
5426
+ const github = opts.github !== false;
5427
+ if (!opts.linear && !opts.abletime && !github) return null;
5428
+ const names = [
5429
+ opts.linear ? "linear_*" : null,
5430
+ github ? "github_*" : null,
5431
+ opts.abletime ? "abletime_*" : null
5432
+ ].filter(Boolean);
5433
+ const ticket = opts.ticketId?.trim();
5434
+ const ticketBit = ticket ? ` This ticket: ${ticket}${opts.ticketProvider ? ` (${opts.ticketProvider})` : ""} \u2014 get/comment/update; create with parent for spin-offs.` : " get/comment/update/create (parent= for spin-offs).";
5435
+ return `Issues: Sideboard ${names.join(" / ")} (Account). Ignore vendor issue MCP auth.${ticketBit}`;
5436
+ }
5375
5437
  function formatPrGateDirective() {
5376
5438
  return [
5377
5439
  "If a goal is given (not after every push):",
@@ -5790,7 +5852,7 @@ function formatScheduledPrompt(name, prompt) {
5790
5852
  ${prompt}`;
5791
5853
  }
5792
5854
  async function defaultDeps() {
5793
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-LXO2CDOG.js");
5855
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-KQO4MXBI.js");
5794
5856
  const orch = getOrchestrator2();
5795
5857
  return {
5796
5858
  findThread: (id) => findThreadByRef(id),
@@ -6558,6 +6620,14 @@ var Orchestrator = class {
6558
6620
  const longRunningReminder = thread.agent !== "brightsy" && !isOrchestratorThread(thread) ? formatLongRunningReminder() : null;
6559
6621
  const worktreeReminder = thread.agent !== "brightsy" && !isOrchestratorThread(thread) ? formatWorktreeReminder() : null;
6560
6622
  const optionalServicesReminder = thread.agent !== "brightsy" && !isOrchestratorThread(thread) ? formatOptionalServicesReminder(loadAppSettings().integrations) : null;
6623
+ const issueTicket = issueTicketFromThread(thread, resolveEffectiveIssueSource());
6624
+ const issueToolsReminder = thread.agent !== "brightsy" && !isOrchestratorThread(thread) ? formatIssueToolsReminder({
6625
+ linear: isLinearConnected(),
6626
+ abletime: isAbleTimeConnected(),
6627
+ github: true,
6628
+ ticketId: issueTicket?.id,
6629
+ ticketProvider: issueTicket?.provider
6630
+ }) : null;
6561
6631
  const slackReplyContext = formatSlackRepliesForTurn(
6562
6632
  pendingSlackExternalReplies(thread.messages)
6563
6633
  );
@@ -6566,6 +6636,7 @@ var Orchestrator = class {
6566
6636
  orchestrationReminder,
6567
6637
  worktreeReminder,
6568
6638
  optionalServicesReminder,
6639
+ issueToolsReminder,
6569
6640
  artifactReminder,
6570
6641
  longRunningReminder,
6571
6642
  slackReplyContext,
@@ -6598,6 +6669,14 @@ var Orchestrator = class {
6598
6669
  const artifactDirective = isBrightsy ? null : formatArtifactDirective();
6599
6670
  const longRunningDirective = isBrightsy || isOrchestration ? null : formatLongRunningDirective();
6600
6671
  const optionalServicesDirective = isBrightsy || isOrchestration ? null : formatOptionalServicesDirective(loadAppSettings().integrations);
6672
+ const freshIssueTicket = issueTicketFromThread(fresh, resolveEffectiveIssueSource());
6673
+ const issueToolsDirective = isBrightsy || isOrchestration ? null : formatIssueToolsDirective({
6674
+ linear: isLinearConnected(),
6675
+ abletime: isAbleTimeConnected(),
6676
+ github: true,
6677
+ ticketId: freshIssueTicket?.id,
6678
+ ticketProvider: freshIssueTicket?.provider
6679
+ });
6601
6680
  const settings = loadWorkspaceSettings(fresh.worktreePath, fresh.repoPath);
6602
6681
  const renameBranchDirective = !isBrightsy && !isOrchestration && autoRenameBranchEnabled() ? formatRenameBranchDirective(fresh, {
6603
6682
  customPrompt: settings?.prompts?.renameBranch
@@ -6628,6 +6707,7 @@ var Orchestrator = class {
6628
6707
  coordinatorDirective,
6629
6708
  worktreeDirective,
6630
6709
  optionalServicesDirective,
6710
+ issueToolsDirective,
6631
6711
  artifactDirective,
6632
6712
  longRunningDirective,
6633
6713
  renameBranchDirective,
@@ -6737,6 +6817,7 @@ var Orchestrator = class {
6737
6817
  coordinatorDirective,
6738
6818
  worktreeDirective,
6739
6819
  optionalServicesDirective,
6820
+ issueToolsDirective,
6740
6821
  artifactDirective,
6741
6822
  longRunningDirective,
6742
6823
  renameBranchDirective,
@@ -7791,7 +7872,7 @@ var Orchestrator = class {
7791
7872
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
7792
7873
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
7793
7874
  try {
7794
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-HO4EQNNM.js");
7875
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-Q2VCHIAS.js");
7795
7876
  await ensureWorkspace2(thread.repoPath);
7796
7877
  } catch {
7797
7878
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isOrchestratorThread
3
- } from "./chunk-MSFPM5VK.js";
3
+ } from "./chunk-CVR4RJ6G.js";
4
4
  import {
5
5
  codexUnattendedGitConfigArgs,
6
6
  mergeAgentGitAuthEnv,
@@ -31,6 +31,8 @@ import {
31
31
  } from "./chunk-HEII7W3Q.js";
32
32
  import {
33
33
  claudeChromeEnabled,
34
+ isAbleTimeConnected,
35
+ isLinearConnected,
34
36
  loadAppSettings,
35
37
  resolveAgentExecutable,
36
38
  resolveClaudeExecutable
@@ -1132,6 +1134,31 @@ var WORKTREE_MCP_TOOLS = [
1132
1134
  "present_schema",
1133
1135
  "present_files"
1134
1136
  ];
1137
+ var WORKTREE_GITHUB_MCP_TOOLS = [
1138
+ "github_get_issue",
1139
+ "github_comment",
1140
+ "github_update_issue",
1141
+ "github_create_issue"
1142
+ ];
1143
+ var WORKTREE_LINEAR_MCP_TOOLS = [
1144
+ "linear_list_teams",
1145
+ "linear_search_issues",
1146
+ "linear_get_issue",
1147
+ "linear_create_issue",
1148
+ "linear_update_issue",
1149
+ "linear_comment"
1150
+ ];
1151
+ var WORKTREE_ABLETIME_MCP_TOOLS = [
1152
+ "abletime_orientation",
1153
+ "abletime_list_projects",
1154
+ "abletime_list_tasks",
1155
+ "abletime_search_tasks",
1156
+ "abletime_get_task",
1157
+ "abletime_comment",
1158
+ "abletime_update_task",
1159
+ "abletime_create_task",
1160
+ "abletime_ensure_task"
1161
+ ];
1135
1162
  function sideboardMcpProfile(env = process.env) {
1136
1163
  return env[SIDEBOARD_MCP_PROFILE_ENV]?.trim().toLowerCase() === "worktree" ? "worktree" : "orchestration";
1137
1164
  }
@@ -1148,6 +1175,16 @@ var SIDEBOARD_ARTIFACT_MCP_ALLOWED_TOOLS = [
1148
1175
  "mcp__sideboard__ask_user",
1149
1176
  "mcp__sideboard__present_plan"
1150
1177
  ];
1178
+ var SIDEBOARD_GITHUB_MCP_ALLOWED_TOOLS = ["mcp__sideboard__github_*"];
1179
+ var SIDEBOARD_LINEAR_MCP_ALLOWED_TOOLS = ["mcp__sideboard__linear_*"];
1180
+ var SIDEBOARD_ABLETIME_MCP_ALLOWED_TOOLS = ["mcp__sideboard__abletime_*"];
1181
+ function sideboardWorktreeAllowedTools(opts) {
1182
+ const out = [...SIDEBOARD_ARTIFACT_MCP_ALLOWED_TOOLS];
1183
+ if (opts?.github !== false) out.push(...SIDEBOARD_GITHUB_MCP_ALLOWED_TOOLS);
1184
+ if (opts?.linear) out.push(...SIDEBOARD_LINEAR_MCP_ALLOWED_TOOLS);
1185
+ if (opts?.abletime) out.push(...SIDEBOARD_ABLETIME_MCP_ALLOWED_TOOLS);
1186
+ return out;
1187
+ }
1151
1188
  var BRIGHTSY_MCP_ALLOWED_TOOLS = [
1152
1189
  "mcp__brightsy",
1153
1190
  "mcp__brightsy__*"
@@ -1819,7 +1856,7 @@ var claudeAdapter = {
1819
1856
  );
1820
1857
  }
1821
1858
  const mode = permissionMode(thread);
1822
- const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-5WZVSWNT.js");
1859
+ const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-5BIW26YR.js");
1823
1860
  const isOrchestrator = isOrchestratorThread2(thread);
1824
1861
  const injectedServers = await buildInjectedMcpServers({
1825
1862
  includeSideboard: true,
@@ -1842,7 +1879,11 @@ var claudeAdapter = {
1842
1879
  allowedTools = [
1843
1880
  ...BASE_ALLOWED_TOOLS,
1844
1881
  ...mcpAllowTools(servers),
1845
- ...SIDEBOARD_ARTIFACT_MCP_ALLOWED_TOOLS,
1882
+ ...sideboardWorktreeAllowedTools({
1883
+ github: true,
1884
+ linear: isLinearConnected(),
1885
+ abletime: isAbleTimeConnected()
1886
+ }),
1846
1887
  ...brightsyMcpAllowedTools(injectedBrightsyNames)
1847
1888
  ];
1848
1889
  }
@@ -3588,6 +3629,9 @@ export {
3588
3629
  normalizeParseResult,
3589
3630
  SIDEBOARD_MCP_PROFILE_ENV,
3590
3631
  WORKTREE_MCP_TOOLS,
3632
+ WORKTREE_GITHUB_MCP_TOOLS,
3633
+ WORKTREE_LINEAR_MCP_TOOLS,
3634
+ WORKTREE_ABLETIME_MCP_TOOLS,
3591
3635
  sideboardMcpProfile,
3592
3636
  SIDEBOARD_MCP_ALLOWED_TOOLS,
3593
3637
  BRIGHTSY_MCP_ALLOWED_TOOLS,
@@ -7,7 +7,7 @@ import {
7
7
  enrichWorkspacesWithGithub,
8
8
  ensureGlobalCoordinatorCwd,
9
9
  formatWorkspaceInventory
10
- } from "./chunk-MSFPM5VK.js";
10
+ } from "./chunk-CVR4RJ6G.js";
11
11
  import "./chunk-LQMFCS54.js";
12
12
  import "./chunk-JRH62XC4.js";
13
13
  import "./chunk-3BWVOUQG.js";
@@ -9,7 +9,7 @@ import {
9
9
  enrichWorkspacesWithGithub,
10
10
  ensureGlobalCoordinatorCwd,
11
11
  formatWorkspaceInventory
12
- } from "./chunk-TI6UMRWK.js";
12
+ } from "./chunk-4I4VKAPZ.js";
13
13
  import "./chunk-CJQLPPEJ.js";
14
14
  import "./chunk-NVXVEGGM.js";
15
15
  import "./chunk-LZQULFIT.js";
@@ -15,7 +15,7 @@ import {
15
15
  orchestratorSessionPoisonedByBuiltins,
16
16
  slackCoordinatorSourceRef,
17
17
  takenTeamSlugsForOrchestration
18
- } from "./chunk-MSFPM5VK.js";
18
+ } from "./chunk-CVR4RJ6G.js";
19
19
  import "./chunk-LQMFCS54.js";
20
20
  import "./chunk-JRH62XC4.js";
21
21
  import "./chunk-3BWVOUQG.js";
@@ -17,7 +17,7 @@ import {
17
17
  orchestratorSessionPoisonedByBuiltins,
18
18
  slackCoordinatorSourceRef,
19
19
  takenTeamSlugsForOrchestration
20
- } from "./chunk-TI6UMRWK.js";
20
+ } from "./chunk-4I4VKAPZ.js";
21
21
  import "./chunk-CJQLPPEJ.js";
22
22
  import "./chunk-NVXVEGGM.js";
23
23
  import "./chunk-LZQULFIT.js";