@sideboard-ai/core 0.1.317 → 0.1.319

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 (40) hide show
  1. package/dist/{abletime-NZ2ABWAL.js → abletime-DVYO4IVS.js} +6 -4
  2. package/dist/{abletime-TKAFNXCM.js → abletime-L3ODNTBT.js} +5 -3
  3. package/dist/{abletime-oauth-S4AXA4WR.js → abletime-oauth-2VWQCXGT.js} +2 -2
  4. package/dist/{abletime-oauth-CBFFBINA.js → abletime-oauth-6DTX7LB7.js} +3 -3
  5. package/dist/{abletime-rest-ORBELZQO.js → abletime-rest-7NICZYOC.js} +2 -2
  6. package/dist/{abletime-rest-NSOP72AI.js → abletime-rest-PYQM234B.js} +3 -3
  7. package/dist/{agents-BJVSYC6Y.js → agents-2AR7I6B6.js} +5 -5
  8. package/dist/{app-settings-RQAFJZCD.js → app-settings-V6YPYY57.js} +1 -1
  9. package/dist/{chunk-CCUGIVYN.js → chunk-5OM7UCTQ.js} +3 -3
  10. package/dist/{chunk-NXNNYY3Q.js → chunk-AESO2KJS.js} +2 -2
  11. package/dist/{chunk-VVV7EI6T.js → chunk-AUJ4XB6H.js} +2 -2
  12. package/dist/{chunk-S3U4HR5F.js → chunk-AZ4GEEGL.js} +2 -2
  13. package/dist/{chunk-U7PNCYNX.js → chunk-E52SQENB.js} +1 -0
  14. package/dist/{chunk-OLYNM52B.js → chunk-FDXHNROD.js} +2 -2
  15. package/dist/{chunk-XWUDFLBX.js → chunk-IAPO7ZFG.js} +4 -4
  16. package/dist/{chunk-VZAJVX36.js → chunk-JD7CC6SW.js} +1 -1
  17. package/dist/{chunk-ELBK34TY.js → chunk-LXBZQP2Q.js} +5 -5
  18. package/dist/{chunk-BXTISNKW.js → chunk-OO3R6CS2.js} +216 -64
  19. package/dist/{chunk-I5CLCWUK.js → chunk-QPLQXWND.js} +8 -4
  20. package/dist/{chunk-4XZJYBO2.js → chunk-ST2UQBJT.js} +4 -4
  21. package/dist/{chunk-YN6XONV5.js → chunk-TUJFCJJU.js} +1 -1
  22. package/dist/{chunk-U53JICJ2.js → chunk-U2N32EA6.js} +233 -81
  23. package/dist/{chunk-GXSV3X3L.js → chunk-WLZHRNE6.js} +9 -5
  24. package/dist/{chunk-PX324N7P.js → chunk-YALFZKSC.js} +2 -2
  25. package/dist/{chunk-7SCVGGF6.js → chunk-ZM43NTJJ.js} +4 -4
  26. package/dist/{conductor-TP2NA44I.js → conductor-MG2RAQNT.js} +4 -4
  27. package/dist/{coordinator-prompt-FQC2SZPP.js → coordinator-prompt-X74F3JIC.js} +3 -3
  28. package/dist/{global-workspace-72K6D354.js → global-workspace-FTNJEML3.js} +3 -3
  29. package/dist/index.cjs +301 -79
  30. package/dist/index.d.cts +29 -9
  31. package/dist/index.d.ts +29 -9
  32. package/dist/index.js +72 -27
  33. package/dist/mcp/run-stdio.cjs +240 -63
  34. package/dist/mcp/run-stdio.js +4 -4
  35. package/dist/{optional-cli-LMSRZNH4.js → optional-cli-6GGESWGE.js} +4 -4
  36. package/dist/{orchestrator-N54V3B76.js → orchestrator-H3DSZ5RM.js} +1 -1
  37. package/dist/{orchestrator-E72HYGTB.js → orchestrator-NCA4LSCC.js} +8 -8
  38. package/dist/{workspaces-GAUHXBUL.js → workspaces-MGKEAYNM.js} +3 -3
  39. package/dist/{worktree-6FUQ7FEF.js → worktree-THAXW5U7.js} +2 -2
  40. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -122,6 +122,7 @@ import {
122
122
  issueMatchesUpdatedSince,
123
123
  issueNeedsWorkspacePick,
124
124
  issueTicketFromThread,
125
+ joinSteerPrompt,
125
126
  lastAgentReply,
126
127
  latestVisibleMessageText,
127
128
  linearTicketIdFromThread,
@@ -131,6 +132,7 @@ import {
131
132
  listLinearIssues,
132
133
  listSchedules,
133
134
  listWorktreeFiles,
135
+ livePartsShowAgentReply,
134
136
  localhostPreviewUrl,
135
137
  markdownPreviewSource,
136
138
  mcpIssueUpdatedSinceSchema,
@@ -194,6 +196,7 @@ import {
194
196
  syncBoardPins,
195
197
  takePendingTurnAttachments,
196
198
  thisProcessShouldDrainAgentQueues,
199
+ trailingUnansweredUserText,
197
200
  updateSchedule,
198
201
  visibleAgentBlock,
199
202
  waitForPidExit,
@@ -203,7 +206,7 @@ import {
203
206
  worktreeCleanupSettings,
204
207
  writeAgentBlock,
205
208
  writeWorktreeFile
206
- } from "./chunk-U53JICJ2.js";
209
+ } from "./chunk-U2N32EA6.js";
207
210
  import {
208
211
  LEGACY_PLAN_FILE_REL,
209
212
  PLAN_FILE_NAME,
@@ -293,7 +296,7 @@ import {
293
296
  userMcpNamesToDisable,
294
297
  worktreeMcpToolNames,
295
298
  writeInjectedMcpConfig
296
- } from "./chunk-XWUDFLBX.js";
299
+ } from "./chunk-IAPO7ZFG.js";
297
300
  import {
298
301
  brightsyMcpServerName,
299
302
  connectBrightsyTeam,
@@ -424,7 +427,7 @@ import {
424
427
  workspaceAgentChatSummaries,
425
428
  worktreeRunPortsPath,
426
429
  wrapReviewSkillMarkdown
427
- } from "./chunk-4XZJYBO2.js";
430
+ } from "./chunk-ST2UQBJT.js";
428
431
  import {
429
432
  STDERR_EVENT_MAX_CHARS,
430
433
  STDOUT_EVENT_MAX_CHARS,
@@ -490,9 +493,10 @@ import {
490
493
  parseAbleTimeOAuthCallbackUrl,
491
494
  resolveAbleTimeOAuthHost,
492
495
  startAbleTimeOAuth
493
- } from "./chunk-CCUGIVYN.js";
496
+ } from "./chunk-5OM7UCTQ.js";
494
497
  import {
495
498
  ableTimeDependencyTarget,
499
+ ableTimeStateIsClosed,
496
500
  commentAbleTimeTask,
497
501
  createAbleTimeTask,
498
502
  downloadAbleTimeAttachment,
@@ -515,10 +519,10 @@ import {
515
519
  toAbleTimeIssueInfo,
516
520
  updateAbleTimeTask,
517
521
  verifyAbleTimeConnection
518
- } from "./chunk-GXSV3X3L.js";
522
+ } from "./chunk-WLZHRNE6.js";
519
523
  import {
520
524
  looksLikeAbleTimeUlid
521
- } from "./chunk-VVV7EI6T.js";
525
+ } from "./chunk-AUJ4XB6H.js";
522
526
  import {
523
527
  ABLETIME_MCP_PATH,
524
528
  ABLETIME_MCP_PM_PATH,
@@ -539,13 +543,13 @@ import {
539
543
  normalizeAbleTimeCredential,
540
544
  normalizeAbleTimeHost,
541
545
  rewriteAbleTimeError
542
- } from "./chunk-ELBK34TY.js";
546
+ } from "./chunk-LXBZQP2Q.js";
543
547
  import {
544
548
  clearOptionalCliPresenceCache,
545
549
  detectOptionalServiceClis,
546
550
  installOptionalServiceCli,
547
551
  optionalCliPresence
548
- } from "./chunk-S3U4HR5F.js";
552
+ } from "./chunk-AZ4GEEGL.js";
549
553
  import {
550
554
  OPTIONAL_SERVICES,
551
555
  OPTIONAL_SERVICE_IDS,
@@ -561,7 +565,7 @@ import {
561
565
  optionalServiceConnected,
562
566
  optionalServiceSpec,
563
567
  verifyOptionalService
564
- } from "./chunk-OLYNM52B.js";
568
+ } from "./chunk-FDXHNROD.js";
565
569
  import {
566
570
  getAgentSetupInfo,
567
571
  installAgent,
@@ -573,7 +577,7 @@ import {
573
577
  prepareTerminalCommand,
574
578
  resolveLoginCommand,
575
579
  whichOnPath
576
- } from "./chunk-NXNNYY3Q.js";
580
+ } from "./chunk-AESO2KJS.js";
577
581
  import {
578
582
  CLOUD_COORDINATOR_BUSY_REPLY,
579
583
  CLOUD_COORDINATOR_CANCELED_REPLY,
@@ -626,7 +630,7 @@ import {
626
630
  stageBuffersAsAttachments,
627
631
  syncWorkspacesFromThreads,
628
632
  takenTeamSlugsForOrchestration
629
- } from "./chunk-PX324N7P.js";
633
+ } from "./chunk-YALFZKSC.js";
630
634
  import {
631
635
  GITHUB_PR_BODY_MAX_CHARS,
632
636
  GITHUB_PR_BODY_SAFE_CHARS,
@@ -714,7 +718,7 @@ import {
714
718
  suggestSlug,
715
719
  switchWorktreeBranch,
716
720
  warmGithubAgentAuth
717
- } from "./chunk-YN6XONV5.js";
721
+ } from "./chunk-TUJFCJJU.js";
718
722
  import {
719
723
  FAMOUS_SOCCER_TEAMS,
720
724
  allocateTeamName,
@@ -1013,7 +1017,7 @@ import {
1013
1017
  withTurnScopedCost,
1014
1018
  writeSecureJson,
1015
1019
  writeViewerContext
1016
- } from "./chunk-U7PNCYNX.js";
1020
+ } from "./chunk-E52SQENB.js";
1017
1021
  import {
1018
1022
  THINKING_EFFORTS,
1019
1023
  isThinkingEffort,
@@ -1205,8 +1209,11 @@ var DirectionalSeal = class {
1205
1209
  recvCounter = 0;
1206
1210
  transcript = "";
1207
1211
  sendDirection;
1212
+ matchesClientNonce(clientNonce) {
1213
+ return clientNonce === this.hello.clientNonce;
1214
+ }
1208
1215
  acceptReady(ready, desktopNonceBytes) {
1209
- if (ready.v !== 1 || ready.clientNonce !== this.hello.clientNonce) return false;
1216
+ if (ready.v !== 1 || !this.matchesClientNonce(ready.clientNonce)) return false;
1210
1217
  const desktopNonce = desktopNonceBytes ?? b64urlToBytes(ready.desktopNonce);
1211
1218
  if (desktopNonce.length !== NONCE_BYTES) return false;
1212
1219
  let shared;
@@ -6392,6 +6399,7 @@ function runRemoteHost(opts) {
6392
6399
  clientNonce: msg.clientNonce
6393
6400
  });
6394
6401
  if (ready) send3({ type: "e2ee_ready", ...ready });
6402
+ else send3({ type: "e2ee_fail" });
6395
6403
  return;
6396
6404
  }
6397
6405
  if (msg.type === "e2ee") {
@@ -6404,8 +6412,13 @@ function runRemoteHost(opts) {
6404
6412
  }
6405
6413
  if (opened.okFrame) {
6406
6414
  send3({ type: "e2ee", frame: opened.okFrame });
6407
- startBoardSync();
6415
+ try {
6416
+ startBoardSync();
6417
+ } catch (err) {
6418
+ log(`remote error: ${err instanceof Error ? err.message : err}`);
6419
+ }
6408
6420
  opts.onPairingCode?.(null);
6421
+ send3({ type: "pairing_done" });
6409
6422
  opts.onStatus?.({ connected: true, phoneConnected: true });
6410
6423
  log("phone joined");
6411
6424
  return;
@@ -7487,6 +7500,10 @@ var RemoteHub = class {
7487
7500
  this.issueCode(socket);
7488
7501
  return;
7489
7502
  }
7503
+ if (msg.type === "pairing_done") {
7504
+ this.finishPairing(socket);
7505
+ return;
7506
+ }
7490
7507
  if (msg.type === "pair") {
7491
7508
  this.pairPhone(socket, msg.code);
7492
7509
  return;
@@ -7566,7 +7583,8 @@ var RemoteHub = class {
7566
7583
  hostSecret,
7567
7584
  socket,
7568
7585
  sessionToken,
7569
- phone: existing?.socket === socket ? existing.phone : null
7586
+ phone: existing?.socket === socket ? existing.phone : null,
7587
+ pairingCode: existing && existing.socket === socket ? existing.pairingCode : null
7570
7588
  };
7571
7589
  this.hosts.set(deviceId, host);
7572
7590
  this.remembered.set(deviceId, { hostSecret, sessionToken, deviceLabel });
@@ -7602,8 +7620,15 @@ var RemoteHub = class {
7602
7620
  send(socket, { type: "error", message: "Mac is offline" });
7603
7621
  return;
7604
7622
  }
7605
- this.codes.delete(code);
7606
- this.attachPhone(socket, host);
7623
+ this.attachPhone(socket, host, void 0, code);
7624
+ }
7625
+ /** The Mac accepted the phone. That QR must not replace the saved session. */
7626
+ finishPairing(socket) {
7627
+ const bound = this.bySocket.get(socket);
7628
+ const host = bound?.role === "host" ? this.hosts.get(bound.deviceId) : null;
7629
+ if (!host || host.socket !== socket) return;
7630
+ if (host.pairingCode) this.codes.delete(host.pairingCode);
7631
+ host.pairingCode = null;
7607
7632
  }
7608
7633
  /** In-memory session, with the live Mac's label when that socket is up. */
7609
7634
  memorySession(sessionToken) {
@@ -7676,7 +7701,7 @@ var RemoteHub = class {
7676
7701
  send(prev.socket, { type: "phone_left" });
7677
7702
  }
7678
7703
  }
7679
- attachPhone(socket, host, sessionToken) {
7704
+ attachPhone(socket, host, sessionToken, pairingCode) {
7680
7705
  const bound = this.bySocket.get(socket);
7681
7706
  if (bound?.role === "phone" && bound.deviceId !== host.deviceId) {
7682
7707
  this.releasePhoneSocket(socket);
@@ -7697,6 +7722,7 @@ var RemoteHub = class {
7697
7722
  }
7698
7723
  host.sessionToken = token;
7699
7724
  host.phone = socket;
7725
+ if (pairingCode) host.pairingCode = pairingCode;
7700
7726
  this.phonesByToken.set(token, { deviceId: host.deviceId, deviceLabel: host.deviceLabel });
7701
7727
  this.remembered.set(host.deviceId, {
7702
7728
  hostSecret: host.hostSecret,
@@ -8731,7 +8757,7 @@ async function startHeadlessHost(opts) {
8731
8757
  };
8732
8758
  const refreshRunning = async () => {
8733
8759
  try {
8734
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-E72HYGTB.js");
8760
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-NCA4LSCC.js");
8735
8761
  agentsRunning = getOrchestrator2().getRuntime().running;
8736
8762
  } catch {
8737
8763
  agentsRunning = 0;
@@ -10664,7 +10690,7 @@ async function handleJobStop(params, _ctx) {
10664
10690
  return stopDetachedJob(jobCwd(rec), id, reason ? { reason } : void 0);
10665
10691
  }
10666
10692
  async function defaultTurnWait(ref, timeoutMs) {
10667
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-E72HYGTB.js");
10693
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-NCA4LSCC.js");
10668
10694
  const orch = getOrchestrator2();
10669
10695
  const thread = await orch.waitForTurn(ref, timeoutMs, {
10670
10696
  resolveIfStillRunning: true
@@ -11017,7 +11043,7 @@ async function startMcpServer() {
11017
11043
  );
11018
11044
  }
11019
11045
  try {
11020
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-RQAFJZCD.js");
11046
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-V6YPYY57.js");
11021
11047
  orch.setMaxConcurrent(maxConcurrentAgents2());
11022
11048
  } catch {
11023
11049
  }
@@ -11565,7 +11591,7 @@ async function startMcpServer() {
11565
11591
  if (!worktreeProfile) {
11566
11592
  registerConnectedIssueVendorTools(server);
11567
11593
  const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-ZNUEZGHB.js");
11568
- const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-RQAFJZCD.js");
11594
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-V6YPYY57.js");
11569
11595
  const accountDefaults = resolveThreadDefaults2();
11570
11596
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
11571
11597
  server.tool(
@@ -12449,6 +12475,9 @@ function firstRecord(record, keys) {
12449
12475
  }
12450
12476
  return null;
12451
12477
  }
12478
+ function taskState(record) {
12479
+ return firstString(record, ["state", "board_state", "boardState", "status", "taskState"]);
12480
+ }
12452
12481
  function identifierFromUnknown(value) {
12453
12482
  if (typeof value === "string" || typeof value === "number") {
12454
12483
  const id2 = String(value).trim();
@@ -12460,6 +12489,7 @@ function identifierFromUnknown(value) {
12460
12489
  for (const key of ["nodes", "data", "tasks", "items"]) {
12461
12490
  if (Array.isArray(rec[key])) return identifierFromUnknown(rec[key]);
12462
12491
  }
12492
+ if (ableTimeStateIsClosed(taskState(rec))) return [];
12463
12493
  const id = firstString(rec, ["identifier", "reference", "ref", "key", "code", "number", "id"]);
12464
12494
  return id ? [id] : [];
12465
12495
  }
@@ -12494,6 +12524,8 @@ async function getAbleTimeIssueBlockedBy(id, opts) {
12494
12524
  continue;
12495
12525
  }
12496
12526
  const parent = await callAbleTimeTool("get_task", { id: blockerId, task_id: blockerId }, opts);
12527
+ const parentRecord = firstRecord(asRecord4(parent), ["task", "data"]) ?? asRecord4(parent);
12528
+ if (ableTimeStateIsClosed(taskState(parentRecord))) continue;
12497
12529
  const ref = taskReference(parent);
12498
12530
  if (!ref || looksLikeAbleTimeUlid(ref)) {
12499
12531
  throw new Error(`AbleTime blocker has no reference: ${blockerId}`);
@@ -12517,6 +12549,8 @@ function githubBlockedByIdentifiers(payload) {
12517
12549
  const rec = node && typeof node === "object" && !Array.isArray(node) ? node : null;
12518
12550
  const number = Number(rec?.number ?? node);
12519
12551
  if (!Number.isFinite(number) || number <= 0) continue;
12552
+ const state = String(rec?.state ?? "").trim().toUpperCase();
12553
+ if (state === "CLOSED") continue;
12520
12554
  const id = `#${number}`;
12521
12555
  const key = id.toLowerCase();
12522
12556
  if (seen.has(key)) continue;
@@ -12529,7 +12563,7 @@ var GITHUB_BLOCKED_BY_QUERY = `
12529
12563
  query($owner: String!, $name: String!, $number: Int!) {
12530
12564
  repository(owner: $owner, name: $name) {
12531
12565
  issue(number: $number) {
12532
- blockedBy(first: 25) { nodes { number } }
12566
+ blockedBy(first: 25) { nodes { number state } }
12533
12567
  }
12534
12568
  }
12535
12569
  }
@@ -12577,15 +12611,21 @@ async function getGitHubIssueBlockedBy(id, opts) {
12577
12611
  }
12578
12612
 
12579
12613
  // src/integrations/linear-blocked.ts
12614
+ var RESOLVED_LINEAR_STATE = /* @__PURE__ */ new Set(["completed", "canceled", "cancelled", "duplicate"]);
12615
+ function linearBlockerStillBlocks(issue) {
12616
+ const type = (issue?.state?.type ?? "").trim().toLowerCase();
12617
+ if (!type) return true;
12618
+ return !RESOLVED_LINEAR_STATE.has(type);
12619
+ }
12580
12620
  var ISSUE_BLOCKED_BY_QUERY = `
12581
12621
  query SideboardIssueBlockedBy($id: String!) {
12582
12622
  issue(id: $id) {
12583
12623
  identifier
12584
12624
  relations(first: 25) {
12585
- nodes { id type relatedIssue { id identifier } }
12625
+ nodes { id type relatedIssue { id identifier state { type } } }
12586
12626
  }
12587
12627
  inverseRelations(first: 25) {
12588
- nodes { id type issue { id identifier } }
12628
+ nodes { id type issue { id identifier state { type } } }
12589
12629
  }
12590
12630
  }
12591
12631
  }
@@ -12596,6 +12636,7 @@ function linearBlockedByIdentifiers(relations) {
12596
12636
  for (const rel of relations) {
12597
12637
  const type = (rel.type ?? "").trim().toLowerCase().replace(/[\s_-]+/g, "");
12598
12638
  if (type !== "blockedby" && type !== "blocked") continue;
12639
+ if (!linearBlockerStillBlocks(rel.issue)) continue;
12599
12640
  const id = (rel.issue?.identifier || rel.issue?.id || "").trim();
12600
12641
  const key = id.toLowerCase();
12601
12642
  if (!id || seen.has(key)) continue;
@@ -14317,7 +14358,7 @@ async function continueSourceThread(threadId, prompt) {
14317
14358
  await continueOnReply(threadId, prompt);
14318
14359
  return;
14319
14360
  }
14320
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-E72HYGTB.js");
14361
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-NCA4LSCC.js");
14321
14362
  await getOrchestrator2().send(threadId, prompt);
14322
14363
  } catch {
14323
14364
  }
@@ -14733,6 +14774,7 @@ export {
14733
14774
  ableTimeOAuthLocalBounceUrl,
14734
14775
  ableTimeOAuthRedirectUri,
14735
14776
  ableTimeOAuthResource,
14777
+ ableTimeStateIsClosed,
14736
14778
  ableTimeUsesRest,
14737
14779
  abletimeMcpRequest,
14738
14780
  abletimeMcpUrl,
@@ -15215,6 +15257,7 @@ export {
15215
15257
  issueMatchesAssignee,
15216
15258
  issueSourceLabel,
15217
15259
  issueTicketFromThread,
15260
+ joinSteerPrompt,
15218
15261
  killDetachedRunTree,
15219
15262
  killListenersOnPorts,
15220
15263
  killStaleWorktreeListeners,
@@ -15273,6 +15316,7 @@ export {
15273
15316
  listWorktrees,
15274
15317
  listenerCwd,
15275
15318
  liveActivitySummary,
15319
+ livePartsShowAgentReply,
15276
15320
  loadAppSettings,
15277
15321
  loadBrightsyConfig,
15278
15322
  loadConductorSettings,
@@ -15610,6 +15654,7 @@ export {
15610
15654
  toolDetail,
15611
15655
  toolFilePath,
15612
15656
  totalTokens,
15657
+ trailingUnansweredUserText,
15613
15658
  trustSystemCertificates,
15614
15659
  tryReservePort,
15615
15660
  tryReservePorts,