@sideboard-ai/core 0.1.10 → 0.1.15

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.ts CHANGED
@@ -193,8 +193,20 @@ interface PrDetails {
193
193
  commits: PrCommitInfo[];
194
194
  comments: PrCommentInfo[];
195
195
  reviews: PrReviewInfo[];
196
+ /** Prefer `getPrChecks` — kept for callers; often empty to avoid nested GraphQL. */
196
197
  checks: PrCheckRun[];
197
198
  }
199
+ /** Lightweight PR fields for the sidebar pill (cheap GraphQL). */
200
+ interface PrMeta {
201
+ number: number;
202
+ title: string;
203
+ url: string;
204
+ state: string;
205
+ isDraft: boolean;
206
+ reviewDecision: string | null;
207
+ baseRefName: string;
208
+ headRefName: string;
209
+ }
198
210
  interface IssueInfo {
199
211
  id: string;
200
212
  identifier: string;
@@ -668,6 +680,29 @@ declare function gh(args: string[], cwd: string, opts?: {
668
680
  exitCode: number;
669
681
  }>;
670
682
 
683
+ /** Detect GitHub API / GraphQL rate-limit failures in gh CLI output. */
684
+ declare function isGhRateLimitError(text: string): boolean;
685
+ /** Relative wait hint from a Unix epoch reset timestamp (seconds). */
686
+ declare function formatRateLimitResetHint(resetEpochSec: number, nowMs?: number): string;
687
+ /**
688
+ * Prefer the trailing GraphQL/HTTP detail over the full `gh` command line
689
+ * (which can include a huge --body payload).
690
+ */
691
+ declare function extractGhErrorDetail(text: string): string;
692
+ type FormatGhLandErrorOptions = {
693
+ /** Unix epoch seconds when the GraphQL/core quota resets. */
694
+ resetAt?: number;
695
+ /** Land push already succeeded before PR create failed. Default true for PR-create path. */
696
+ pushed?: boolean;
697
+ nowMs?: number;
698
+ };
699
+ /**
700
+ * Turn noisy `gh pr create` / Execa failures into a short notice for UI/CLI.
701
+ */
702
+ declare function formatGhLandError(raw: string, opts?: FormatGhLandErrorOptions): string;
703
+ /** Strip Electron's IPC invoke wrapper, then humanize known gh failures. */
704
+ declare function formatIpcInvokeError(err: unknown): string;
705
+
671
706
  /**
672
707
  * Memorable worktree / thread labels (Conductor-style nicknames).
673
708
  * Slug is the directory + `thread/<slug>` branch; `name` is the UI title.
@@ -768,7 +803,9 @@ declare function detectLocalMergeConflicts(cwd: string, baseRefName: string | nu
768
803
  * Returns `null` when no PR exists for the selector (so UI can show “link a PR”
769
804
  * instead of “no checks yet”). Returns `[]` when a PR exists but has no checks. */
770
805
  declare function getPrChecks(cwd: string, selector: string): Promise<PrCheckRun[] | null>;
771
- /** PR description / commits / reviews (+ checks) for the Review tab. */
806
+ /** Lightweight PR fields for the sidebar pill avoids nested reviews/checks GraphQL. */
807
+ declare function getPrMeta(cwd: string, selector: string): Promise<PrMeta | null>;
808
+ /** PR description / reviews for the Review tab (no nested CI — use getPrChecks). */
772
809
  declare function getPrDetails(cwd: string, selector: string): Promise<PrDetails | null>;
773
810
  declare function fetchPrHead(repoPath: string, number: number, localBranch: string): Promise<void>;
774
811
  interface CreateWorktreeResult {
@@ -1712,6 +1749,7 @@ declare class Orchestrator {
1712
1749
  /** Resolve PR selector and optionally persist `prUrl` when found. */
1713
1750
  private withPrSelector;
1714
1751
  getPrChecks(threadRef: string): Promise<PrCheckRun[] | null>;
1752
+ getPrMeta(threadRef: string): Promise<PrMeta | null>;
1715
1753
  getPrDetails(threadRef: string): Promise<PrDetails | null>;
1716
1754
  setAutonomy(threadRef: string, autonomy: Autonomy): Thread;
1717
1755
  setThreadOptions(threadRef: string, patch: ThreadOptionsPatch): Thread;
@@ -1967,7 +2005,9 @@ interface IpcApi {
1967
2005
  initializeGit(threadRef: string): Promise<void>;
1968
2006
  /** CI checks for the thread's linked PR (`gh pr checks`). `null` = no PR. */
1969
2007
  getPrChecks(threadRef: string): Promise<PrCheckRun[] | null>;
1970
- /** PR description / commits / reviews for the Review tab. */
2008
+ /** Lightweight PR fields for the sidebar pill (cheap GraphQL). */
2009
+ getPrMeta(threadRef: string): Promise<PrMeta | null>;
2010
+ /** PR description / reviews for the Review tab. */
1971
2011
  getPrDetails(threadRef: string): Promise<PrDetails | null>;
1972
2012
  listFiles(threadRef: string): Promise<string[]>;
1973
2013
  readFile(threadRef: string, relativePath: string): Promise<{
@@ -2112,6 +2152,33 @@ interface IpcApi {
2112
2152
  exitCode: number | null;
2113
2153
  }>;
2114
2154
  openExternal(url: string): Promise<void>;
2155
+ /**
2156
+ * In-app URL preview via BrowserView (top-level navigation — works for
2157
+ * sites that block iframes, e.g. GitHub).
2158
+ */
2159
+ urlPreview: {
2160
+ show(opts: {
2161
+ url: string;
2162
+ bounds: {
2163
+ x: number;
2164
+ y: number;
2165
+ width: number;
2166
+ height: number;
2167
+ };
2168
+ }): Promise<void>;
2169
+ setBounds(bounds: {
2170
+ x: number;
2171
+ y: number;
2172
+ width: number;
2173
+ height: number;
2174
+ }): Promise<void>;
2175
+ navigate(url: string): Promise<void>;
2176
+ reload(): Promise<void>;
2177
+ hide(): Promise<void>;
2178
+ onNavigated(listener: (payload: {
2179
+ url: string;
2180
+ }) => void): () => void;
2181
+ };
2115
2182
  /** Main-process tsserver for real import/type diagnostics in the file UI. */
2116
2183
  tsserver: {
2117
2184
  start(worktreePath?: string): Promise<{
@@ -2281,4 +2348,4 @@ declare function writeInjectedMcpConfig(opts: {
2281
2348
  includeBrightsy?: boolean;
2282
2349
  }): Promise<string | null>;
2283
2350
 
2284
- export { type ActiveRun, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentInstructionFile, type AgentKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, 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, COORDINATOR_TOOL_PLAYBOOK, type ClaudeHarnessSettings, type CleanupOrphansResult, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateThreadInput, type CreateWorktreeResult, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DevServerHandle, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GitHubStatus, type GitWorktreeStatus, HARNESS_ENV_KEYS, type HarnessId, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, type LandPreview, type LandResult, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, Orchestrator, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PLAN_MODE_INSTRUCTION, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrReviewInfo, type RepoSettings, type RepoSetupInfo, type RunMode, type RunScript, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, type ScriptHandle, type SkillInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, type TeamName, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type TranscriptToolDetail, type TurnCommand, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, addWorkspace, adoptThread, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendMessage, applyAgentEvent, applyAppEnvironment, applyCompaction, applyThreadIntoMain, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildForkTranscriptAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, captureLoginEnv, captureTurnBaseline, childEnvWithAppSettings, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, collectTakenTeamSlugs, commitAll, conductorDbPath, confirmLand, connectBrightsyTeam, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, createChatTab, createEmptyThread, createGlobalChat, createOrUpdatePr, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, deleteBranchOnPurgeEnabled, deleteThreadRecord, detectAgents, detectLocalMergeConflicts, disconnectBrightsyTeam, discoverSkills, encodeBrightsyTarget, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGlobalCoordinatorCwd, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractiveSummary, fetchPrHead, finalizeParts, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findThreadByRef, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatBrightsyFetchError, formatMessagesAsTranscript, formatRenameBranchDirective, formatTranscriptMarkdown, formatWorkspaceInventory, formatWorktreeDirective, getAdapter, getBrightsySession, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getIssueSource, getLinearApiKey, getOrchestrator, getPr, getPrChecks, getPrDetails, getRepoSetupInfo, getRunMode, getRunScript, gh, git, globalAgentCwd, harnessEnvKey, hasConductorHook, hasCursorWorktreeSetup, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, importConductorWorkspace, importConductorWorkspaceAsync, initializeGitRepository, inspectGitWorktree, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isDirty, isGlobalRepoPath, isGlobalThread, isLinearConnected, isOrchestratorThread, isPlaceholderBranch, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listConductorWorkspaces, listConnectedBrightsyTeams, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listPrs, listRunScripts, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergePr, mergeUsage, normalizeParseResult, normalizeThread, normalizeTurnInput, normalizeWorktreePath, opencodeAdapter, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, parseCursorRunnerLine, parseForceStopMessage, parseGithubSlugFromRemoteUrl, parseMcpList, partsToAssistantText, permissionMode, previewLand, pushBranch, readSkillBody, readThread, readWorktreeFile, readWorktreeInclude, refreshGitHubAuth, removeWorkspace, removeWorktree, repoSlug, requireAgent, resolveClaudeExecutable, resolveConductorCursorAgentId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGithubRepoSlug, resolvePrSelector, resolveRepoRoot, resolveWorktreeStartPoint, run, runArchiveScript, runCloudConnect, runCursorWorktreeSetup, runSetupScript, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, setStatus, settingsSourceLabel, shouldCompactContext, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardReposDir, sideboardWorkspacesDir, slugify, spawnAgentTurn, splitForCompaction, startDevServer, startMcpServer, startOrchestration, stripBrightsyNdjsonNoise, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, threadDisplayLabel, threadFilePath, threadLockPath, threadsDir, threadsSharingWorktree, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateIntegrationsSettings, updateThread, validateLinearApiKey, withAgentInstructions, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, writeInjectedMcpConfig, writeThread, writeWorktreeFile };
2351
+ export { type ActiveRun, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentInstructionFile, type AgentKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, 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, COORDINATOR_TOOL_PLAYBOOK, type ClaudeHarnessSettings, type CleanupOrphansResult, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateThreadInput, type CreateWorktreeResult, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DevServerHandle, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GitHubStatus, type GitWorktreeStatus, HARNESS_ENV_KEYS, type HarnessId, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, type LandPreview, type LandResult, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, Orchestrator, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PLAN_MODE_INSTRUCTION, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type RepoSettings, type RepoSetupInfo, type RunMode, type RunScript, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, type ScriptHandle, type SkillInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, type TeamName, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type TranscriptToolDetail, type TurnCommand, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, addWorkspace, adoptThread, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendMessage, applyAgentEvent, applyAppEnvironment, applyCompaction, applyThreadIntoMain, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildForkTranscriptAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, captureLoginEnv, captureTurnBaseline, childEnvWithAppSettings, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, collectTakenTeamSlugs, commitAll, conductorDbPath, confirmLand, connectBrightsyTeam, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, createChatTab, createEmptyThread, createGlobalChat, createOrUpdatePr, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, deleteBranchOnPurgeEnabled, deleteThreadRecord, detectAgents, detectLocalMergeConflicts, disconnectBrightsyTeam, discoverSkills, encodeBrightsyTarget, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGlobalCoordinatorCwd, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractGhErrorDetail, extractiveSummary, fetchPrHead, finalizeParts, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findThreadByRef, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatBrightsyFetchError, formatGhLandError, formatIpcInvokeError, formatMessagesAsTranscript, formatRateLimitResetHint, formatRenameBranchDirective, formatTranscriptMarkdown, formatWorkspaceInventory, formatWorktreeDirective, getAdapter, getBrightsySession, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getIssueSource, getLinearApiKey, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrMeta, getRepoSetupInfo, getRunMode, getRunScript, gh, git, globalAgentCwd, harnessEnvKey, hasConductorHook, hasCursorWorktreeSetup, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, importConductorWorkspace, importConductorWorkspaceAsync, initializeGitRepository, inspectGitWorktree, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isDirty, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isLinearConnected, isOrchestratorThread, isPlaceholderBranch, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listConductorWorkspaces, listConnectedBrightsyTeams, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listPrs, listRunScripts, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergePr, mergeUsage, normalizeParseResult, normalizeThread, normalizeTurnInput, normalizeWorktreePath, opencodeAdapter, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, parseCursorRunnerLine, parseForceStopMessage, parseGithubSlugFromRemoteUrl, parseMcpList, partsToAssistantText, permissionMode, previewLand, pushBranch, readSkillBody, readThread, readWorktreeFile, readWorktreeInclude, refreshGitHubAuth, removeWorkspace, removeWorktree, repoSlug, requireAgent, resolveClaudeExecutable, resolveConductorCursorAgentId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGithubRepoSlug, resolvePrSelector, resolveRepoRoot, resolveWorktreeStartPoint, run, runArchiveScript, runCloudConnect, runCursorWorktreeSetup, runSetupScript, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, setStatus, settingsSourceLabel, shouldCompactContext, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardReposDir, sideboardWorkspacesDir, slugify, spawnAgentTurn, splitForCompaction, startDevServer, startMcpServer, startOrchestration, stripBrightsyNdjsonNoise, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, threadDisplayLabel, threadFilePath, threadLockPath, threadsDir, threadsSharingWorktree, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateIntegrationsSettings, updateThread, validateLinearApiKey, withAgentInstructions, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, writeInjectedMcpConfig, writeThread, writeWorktreeFile };
package/dist/index.js CHANGED
@@ -93,14 +93,14 @@ import {
93
93
  withAgentInstructions,
94
94
  worktreeCleanupSettings,
95
95
  writeWorktreeFile
96
- } from "./chunk-E4PWXO2C.js";
96
+ } from "./chunk-MAWKQA2Y.js";
97
97
  import {
98
98
  addWorkspace,
99
99
  ensureWorkspace,
100
100
  listWorkspaces,
101
101
  removeWorkspace,
102
102
  syncWorkspacesFromThreads
103
- } from "./chunk-TLJH3L2C.js";
103
+ } from "./chunk-MGSJQMJA.js";
104
104
  import {
105
105
  CLOUD_COORDINATOR_BUSY_REPLY,
106
106
  CLOUD_COORDINATOR_STOPPED_REPLY,
@@ -120,7 +120,7 @@ import {
120
120
  orchestratorSessionPoisonedByBuiltins,
121
121
  parseForceStopMessage,
122
122
  takenTeamSlugsForOrchestration
123
- } from "./chunk-2M4OHXYX.js";
123
+ } from "./chunk-3OJG4LP4.js";
124
124
  import {
125
125
  COORDINATOR_TOOL_PLAYBOOK,
126
126
  coordinatorSystemPrompt,
@@ -128,7 +128,7 @@ import {
128
128
  enrichWorkspacesWithGithub,
129
129
  ensureGlobalCoordinatorCwd,
130
130
  formatWorkspaceInventory
131
- } from "./chunk-2R5VV4BA.js";
131
+ } from "./chunk-TNIAXABV.js";
132
132
  import {
133
133
  BRIGHTSY_MCP_ALLOWED_TOOLS,
134
134
  MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS,
@@ -158,7 +158,7 @@ import {
158
158
  permissionMode,
159
159
  sanitizeMcpServerName,
160
160
  writeInjectedMcpConfig
161
- } from "./chunk-WMCPLDW3.js";
161
+ } from "./chunk-MEI4AXV4.js";
162
162
  import {
163
163
  brightsyConfigPath,
164
164
  brightsyMcpServerName,
@@ -216,11 +216,17 @@ import {
216
216
  createThreadWorktree,
217
217
  currentBranch,
218
218
  detectLocalMergeConflicts,
219
+ extractGhErrorDetail,
219
220
  fetchPrHead,
221
+ formatGhLandError,
222
+ formatIpcInvokeError,
223
+ formatRateLimitResetHint,
220
224
  getPr,
221
225
  getPrChecks,
222
226
  getPrDetails,
227
+ getPrMeta,
223
228
  isDirty,
229
+ isGhRateLimitError,
224
230
  isPlaceholderBranch,
225
231
  listBranches,
226
232
  listPrs,
@@ -242,7 +248,7 @@ import {
242
248
  worktreeDisplayLabel,
243
249
  worktreeDisplayLabelForGroup,
244
250
  worktreeNameFromPath
245
- } from "./chunk-LL7DTZ5B.js";
251
+ } from "./chunk-L44AX7IG.js";
246
252
  import {
247
253
  appendMessage,
248
254
  createEmptyThread,
@@ -752,6 +758,7 @@ export {
752
758
  estimateMessageChars,
753
759
  estimateThreadChars,
754
760
  expandComposerPrompt,
761
+ extractGhErrorDetail,
755
762
  extractiveSummary,
756
763
  fetchPrHead,
757
764
  finalizeParts,
@@ -764,7 +771,10 @@ export {
764
771
  forkThreadWorktree,
765
772
  formatAgentInstructions,
766
773
  formatBrightsyFetchError,
774
+ formatGhLandError,
775
+ formatIpcInvokeError,
767
776
  formatMessagesAsTranscript,
777
+ formatRateLimitResetHint,
768
778
  formatRenameBranchDirective,
769
779
  formatTranscriptMarkdown,
770
780
  formatWorkspaceInventory,
@@ -781,6 +791,7 @@ export {
781
791
  getPr,
782
792
  getPrChecks,
783
793
  getPrDetails,
794
+ getPrMeta,
784
795
  getRepoSetupInfo,
785
796
  getRunMode,
786
797
  getRunScript,
@@ -801,6 +812,7 @@ export {
801
812
  isBrightsyNdjsonLine,
802
813
  isCloudCoordinatorThread,
803
814
  isDirty,
815
+ isGhRateLimitError,
804
816
  isGlobalRepoPath,
805
817
  isGlobalThread,
806
818
  isLinearConnected,
@@ -2156,6 +2156,52 @@ var init_worktree_labels = __esm({
2156
2156
  }
2157
2157
  });
2158
2158
 
2159
+ // src/git/gh-errors.ts
2160
+ function isGhRateLimitError(text) {
2161
+ return /API rate limit (already )?exceeded/i.test(text) || /rate limit exceeded/i.test(text);
2162
+ }
2163
+ function formatRateLimitResetHint(resetEpochSec, nowMs = Date.now()) {
2164
+ const ms = resetEpochSec * 1e3 - nowMs;
2165
+ if (ms <= 0) return "soon";
2166
+ const mins = Math.max(1, Math.ceil(ms / 6e4));
2167
+ if (mins < 60) {
2168
+ return `in about ${mins} minute${mins === 1 ? "" : "s"}`;
2169
+ }
2170
+ const hours = Math.ceil(mins / 60);
2171
+ return `in about ${hours} hour${hours === 1 ? "" : "s"}`;
2172
+ }
2173
+ function extractGhErrorDetail(text) {
2174
+ const trimmed = text.trim();
2175
+ if (!trimmed) return "";
2176
+ const graphql = trimmed.match(/\bGraphQL:\s*(.+)$/im);
2177
+ if (graphql?.[1]) return `GraphQL: ${graphql[1].trim()}`;
2178
+ const http = trimmed.match(/\bHTTP\s+\d{3}:\s*(.+)$/im);
2179
+ if (http?.[1]) return `HTTP: ${http[1].trim()}`;
2180
+ const lines = trimmed.split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
2181
+ if (lines.length > 1 && /^Command failed with exit code/i.test(lines[0])) {
2182
+ return lines.slice(1).join(" ").trim() || lines[0];
2183
+ }
2184
+ return trimmed;
2185
+ }
2186
+ function formatGhLandError(raw, opts) {
2187
+ const trimmed = raw.trim();
2188
+ if (trimmed.startsWith("GitHub API rate limit exceeded.")) {
2189
+ return trimmed;
2190
+ }
2191
+ const detail = extractGhErrorDetail(raw);
2192
+ if (isGhRateLimitError(raw) || isGhRateLimitError(detail)) {
2193
+ const when = opts?.resetAt ? ` Try again ${formatRateLimitResetHint(opts.resetAt, opts.nowMs)}.` : " Wait a few minutes and try again.";
2194
+ const pushNote = opts?.pushed === false ? "" : " Your branch was already pushed.";
2195
+ return `GitHub API rate limit exceeded.${pushNote}${when} Or create the pull request in the browser (Push & open on GitHub).`;
2196
+ }
2197
+ return detail || "Failed to create or update pull request";
2198
+ }
2199
+ var init_gh_errors = __esm({
2200
+ "src/git/gh-errors.ts"() {
2201
+ "use strict";
2202
+ }
2203
+ });
2204
+
2159
2205
  // src/git/pr-gates.ts
2160
2206
  function buildMergeGateChecks(gate, opts = {}) {
2161
2207
  const rows = [];
@@ -2265,6 +2311,7 @@ __export(worktree_exports, {
2265
2311
  getPr: () => getPr,
2266
2312
  getPrChecks: () => getPrChecks,
2267
2313
  getPrDetails: () => getPrDetails,
2314
+ getPrMeta: () => getPrMeta,
2268
2315
  isDirty: () => isDirty,
2269
2316
  isPlaceholderBranch: () => isPlaceholderBranch,
2270
2317
  listBranches: () => listBranches,
@@ -2288,6 +2335,24 @@ __export(worktree_exports, {
2288
2335
  worktreeDisplayLabelForGroup: () => worktreeDisplayLabelForGroup,
2289
2336
  worktreeNameFromPath: () => worktreeNameFromPath
2290
2337
  });
2338
+ async function lookupGithubGraphqlReset(cwd) {
2339
+ const result = await gh(["api", "rate_limit"], cwd, { reject: false });
2340
+ if (result.exitCode !== 0 || !result.stdout.trim()) return void 0;
2341
+ try {
2342
+ const data = JSON.parse(result.stdout);
2343
+ const reset = data.resources?.graphql?.reset;
2344
+ return typeof reset === "number" ? reset : void 0;
2345
+ } catch {
2346
+ return void 0;
2347
+ }
2348
+ }
2349
+ async function formatPrCreateFailure(raw, cwd) {
2350
+ if (!isGhRateLimitError(raw)) {
2351
+ return formatGhLandError(raw);
2352
+ }
2353
+ const resetAt = await lookupGithubGraphqlReset(cwd);
2354
+ return formatGhLandError(raw, { resetAt });
2355
+ }
2291
2356
  function slugify(input) {
2292
2357
  return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48);
2293
2358
  }
@@ -2602,6 +2667,37 @@ async function getPrChecks(cwd, selector) {
2602
2667
  });
2603
2668
  return [...gateRows, ...ciChecks];
2604
2669
  }
2670
+ async function getPrMeta(cwd, selector) {
2671
+ const slug = await resolveGithubRepoSlug(cwd);
2672
+ const viewArgs = [
2673
+ "pr",
2674
+ "view",
2675
+ selector,
2676
+ "--json",
2677
+ "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName"
2678
+ ];
2679
+ if (slug) viewArgs.push("--repo", slug);
2680
+ const { stdout, exitCode, stderr } = await gh(viewArgs, cwd, { reject: false });
2681
+ if (exitCode !== 0 || !stdout.trim()) {
2682
+ if (/no pull requests found/i.test(stderr)) return null;
2683
+ return null;
2684
+ }
2685
+ try {
2686
+ const view = JSON.parse(stdout);
2687
+ return {
2688
+ number: Number(view.number),
2689
+ title: String(view.title ?? ""),
2690
+ url: String(view.url ?? ""),
2691
+ state: String(view.state ?? ""),
2692
+ isDraft: Boolean(view.isDraft),
2693
+ reviewDecision: typeof view.reviewDecision === "string" && view.reviewDecision ? view.reviewDecision : null,
2694
+ baseRefName: String(view.baseRefName ?? ""),
2695
+ headRefName: String(view.headRefName ?? "")
2696
+ };
2697
+ } catch {
2698
+ return null;
2699
+ }
2700
+ }
2605
2701
  async function getPrDetails(cwd, selector) {
2606
2702
  const slug = await resolveGithubRepoSlug(cwd);
2607
2703
  const viewArgs = [
@@ -2623,7 +2719,6 @@ async function getPrDetails(cwd, selector) {
2623
2719
  "additions",
2624
2720
  "deletions",
2625
2721
  "changedFiles",
2626
- "commits",
2627
2722
  "comments",
2628
2723
  "reviews"
2629
2724
  ].join(",")
@@ -2642,14 +2737,7 @@ async function getPrDetails(cwd, selector) {
2642
2737
  } catch {
2643
2738
  throw new Error(stderr.trim() || "gh pr view returned invalid JSON");
2644
2739
  }
2645
- let checks = [];
2646
- try {
2647
- checks = await getPrChecks(cwd, selector) ?? [];
2648
- } catch {
2649
- checks = [];
2650
- }
2651
2740
  const author = view.author ?? {};
2652
- const commits = Array.isArray(view.commits) ? view.commits : [];
2653
2741
  const comments = Array.isArray(view.comments) ? view.comments : [];
2654
2742
  const reviews = Array.isArray(view.reviews) ? view.reviews : [];
2655
2743
  return {
@@ -2666,19 +2754,8 @@ async function getPrDetails(cwd, selector) {
2666
2754
  additions: Number(view.additions ?? 0),
2667
2755
  deletions: Number(view.deletions ?? 0),
2668
2756
  changedFiles: Number(view.changedFiles ?? 0),
2669
- commits: commits.map((c) => {
2670
- const row = c;
2671
- const authors = Array.isArray(row.authors) ? row.authors.map((a) => {
2672
- const actor = a;
2673
- return { login: actor.login ?? "unknown", name: actor.name ?? null };
2674
- }) : [];
2675
- return {
2676
- oid: String(row.oid ?? ""),
2677
- messageHeadline: String(row.messageHeadline ?? ""),
2678
- committedDate: String(row.committedDate ?? ""),
2679
- authors
2680
- };
2681
- }),
2757
+ // Commits live in Changes; omit from GraphQL to save rate-limit points.
2758
+ commits: [],
2682
2759
  comments: comments.map((c) => {
2683
2760
  const row = c;
2684
2761
  const a = row.author ?? {};
@@ -2698,7 +2775,8 @@ async function getPrDetails(cwd, selector) {
2698
2775
  submittedAt: normalizeGhTime(row.submittedAt)
2699
2776
  };
2700
2777
  }),
2701
- checks
2778
+ // CI lives in Checks tab via getPrChecks — nesting burned GraphQL points.
2779
+ checks: []
2702
2780
  };
2703
2781
  }
2704
2782
  async function fetchPrHead(repoPath, number, localBranch) {
@@ -2928,8 +3006,12 @@ async function createOrUpdatePr(worktreePath, opts) {
2928
3006
  opts.head
2929
3007
  ];
2930
3008
  if (opts.draft) args.push("--draft");
2931
- const { stdout } = await gh(args, worktreePath);
2932
- const url = stdout.trim().split("\n").find((l) => l.startsWith("http")) ?? stdout.trim();
3009
+ const created = await gh(args, worktreePath, { reject: false });
3010
+ if (created.exitCode !== 0) {
3011
+ const raw = created.stderr.trim() || created.stdout.trim() || "gh pr create failed";
3012
+ throw new Error(await formatPrCreateFailure(raw, worktreePath));
3013
+ }
3014
+ const url = created.stdout.trim().split("\n").find((l) => l.startsWith("http")) ?? created.stdout.trim();
2933
3015
  return url;
2934
3016
  }
2935
3017
  function suggestSlug(source) {
@@ -2990,6 +3072,7 @@ var init_worktree = __esm({
2990
3072
  init_thread_store();
2991
3073
  init_teams();
2992
3074
  init_worktree_labels();
3075
+ init_gh_errors();
2993
3076
  init_run();
2994
3077
  init_pr_gates();
2995
3078
  init_teams();
@@ -4258,6 +4341,9 @@ __export(workspaces_exports, {
4258
4341
  function workspacesFile() {
4259
4342
  return (0, import_node_path16.join)(appDataDir(), "workspaces.json");
4260
4343
  }
4344
+ function removedWorkspacesFile() {
4345
+ return (0, import_node_path16.join)(appDataDir(), "removed-workspaces.json");
4346
+ }
4261
4347
  function readAll() {
4262
4348
  const path = workspacesFile();
4263
4349
  if (!(0, import_node_fs16.existsSync)(path)) return [];
@@ -4272,12 +4358,41 @@ function writeAll(list) {
4272
4358
  (0, import_node_fs16.mkdirSync)(appDataDir(), { recursive: true });
4273
4359
  (0, import_node_fs16.writeFileSync)(workspacesFile(), JSON.stringify(list, null, 2), "utf8");
4274
4360
  }
4361
+ function readRemoved() {
4362
+ const path = removedWorkspacesFile();
4363
+ if (!(0, import_node_fs16.existsSync)(path)) return /* @__PURE__ */ new Set();
4364
+ try {
4365
+ const raw = JSON.parse((0, import_node_fs16.readFileSync)(path, "utf8"));
4366
+ return new Set(Array.isArray(raw) ? raw.filter((p) => typeof p === "string") : []);
4367
+ } catch {
4368
+ return /* @__PURE__ */ new Set();
4369
+ }
4370
+ }
4371
+ function writeRemoved(paths) {
4372
+ (0, import_node_fs16.mkdirSync)(appDataDir(), { recursive: true });
4373
+ (0, import_node_fs16.writeFileSync)(removedWorkspacesFile(), JSON.stringify([...paths].sort(), null, 2), "utf8");
4374
+ }
4375
+ function rememberRemoved(repoPath) {
4376
+ const next = readRemoved();
4377
+ next.add(repoPath);
4378
+ writeRemoved(next);
4379
+ }
4380
+ function forgetRemoved(repoPath) {
4381
+ const next = readRemoved();
4382
+ if (!next.delete(repoPath)) return;
4383
+ writeRemoved(next);
4384
+ }
4275
4385
  function listWorkspaces() {
4276
- return readAll().sort((a, b) => a.name.localeCompare(b.name));
4386
+ const all = readAll();
4387
+ const valid = all.filter((w) => Boolean(w.path) && w.path !== "/" && w.path !== ".");
4388
+ if (valid.length !== all.length) writeAll(valid);
4389
+ return valid.sort((a, b) => a.name.localeCompare(b.name));
4277
4390
  }
4278
4391
  async function addWorkspace(repoPath) {
4279
4392
  const root = await resolveRepoRoot(repoPath);
4393
+ if (!root || root === "/") throw new Error(`Invalid repo path: ${repoPath}`);
4280
4394
  if (!(0, import_node_fs16.existsSync)(root)) throw new Error(`Repo not found: ${root}`);
4395
+ forgetRemoved(root);
4281
4396
  const current = readAll();
4282
4397
  const existing = current.find((w) => w.path === root);
4283
4398
  if (existing) return existing;
@@ -4291,16 +4406,20 @@ async function addWorkspace(repoPath) {
4291
4406
  }
4292
4407
  function removeWorkspace(repoPath) {
4293
4408
  writeAll(readAll().filter((w) => w.path !== repoPath));
4409
+ rememberRemoved(repoPath);
4294
4410
  }
4295
4411
  async function ensureWorkspace(repoPath) {
4296
4412
  return addWorkspace(repoPath);
4297
4413
  }
4298
4414
  function syncWorkspacesFromThreads(repoPaths) {
4299
4415
  const current = readAll();
4416
+ const removed = readRemoved();
4300
4417
  const byPath = new Map(current.map((w) => [w.path, w]));
4301
4418
  let dirty = false;
4302
4419
  for (const path of repoPaths) {
4303
- if (!path || isGlobalRepoPath(path) || byPath.has(path)) continue;
4420
+ if (!path || path === "/" || isGlobalRepoPath(path) || byPath.has(path) || removed.has(path)) {
4421
+ continue;
4422
+ }
4304
4423
  if (!(0, import_node_fs16.existsSync)(path)) continue;
4305
4424
  const ws = {
4306
4425
  path,
@@ -6604,6 +6723,7 @@ async function suggestPrMetadata(worktreePath, opts) {
6604
6723
  }
6605
6724
 
6606
6725
  // src/land/land.ts
6726
+ init_gh_errors();
6607
6727
  async function previewLand(thread) {
6608
6728
  if (thread.sourceIsFork) {
6609
6729
  return {
@@ -6667,15 +6787,24 @@ async function confirmLand(thread, opts) {
6667
6787
  const head = headOut.trim();
6668
6788
  const branch = head && head !== "HEAD" ? head : thread.branchName;
6669
6789
  await pushBranch(thread.worktreePath, branch);
6670
- const prUrl = await createOrUpdatePr(thread.worktreePath, {
6671
- title: meta.title,
6672
- body: meta.body,
6673
- base: preview.target,
6674
- head: branch,
6675
- draft: opts?.draft,
6676
- web: opts?.web
6677
- });
6678
- return { prUrl, pushed: true, committed };
6790
+ try {
6791
+ const prUrl = await createOrUpdatePr(thread.worktreePath, {
6792
+ title: meta.title,
6793
+ body: meta.body,
6794
+ base: preview.target,
6795
+ head: branch,
6796
+ draft: opts?.draft,
6797
+ web: opts?.web
6798
+ });
6799
+ return { prUrl, pushed: true, committed };
6800
+ } catch (err) {
6801
+ const raw = err instanceof Error ? err.message : String(err);
6802
+ if (raw.startsWith("GitHub API rate limit exceeded.")) throw err;
6803
+ if (/Command failed with exit code|API rate limit/i.test(raw)) {
6804
+ throw new Error(formatGhLandError(raw));
6805
+ }
6806
+ throw err;
6807
+ }
6679
6808
  }
6680
6809
 
6681
6810
  // src/skills/discover.ts
@@ -7175,7 +7304,7 @@ var Orchestrator = class {
7175
7304
  return thread;
7176
7305
  }
7177
7306
  listWorkspaces() {
7178
- const fromThreads = listThreads({ includeArchived: true }).map((t) => t.repoPath);
7307
+ const fromThreads = listThreads({ includeArchived: false }).map((t) => t.repoPath);
7179
7308
  return syncWorkspacesFromThreads(fromThreads);
7180
7309
  }
7181
7310
  async addWorkspace(repoPath) {
@@ -7792,8 +7921,8 @@ var Orchestrator = class {
7792
7921
  if (result.prUrl) {
7793
7922
  const patch = { prUrl: result.prUrl };
7794
7923
  try {
7795
- const details = await getPrDetails(thread.worktreePath, result.prUrl);
7796
- if (details?.title) patch.prTitle = details.title;
7924
+ const meta = await getPrMeta(thread.worktreePath, result.prUrl);
7925
+ if (meta?.title) patch.prTitle = meta.title;
7797
7926
  } catch {
7798
7927
  }
7799
7928
  updateThread(thread.id, patch);
@@ -7826,6 +7955,24 @@ var Orchestrator = class {
7826
7955
  if (!selector) return null;
7827
7956
  return getPrChecks(cwd, selector);
7828
7957
  }
7958
+ async getPrMeta(threadRef) {
7959
+ const { thread, selector, cwd } = await this.withPrSelector(threadRef);
7960
+ if (!selector) return null;
7961
+ const meta = await getPrMeta(cwd, selector);
7962
+ if (meta) {
7963
+ const patch = {};
7964
+ if (meta.url && meta.url !== thread.prUrl) patch.prUrl = meta.url;
7965
+ if (meta.title && meta.title !== thread.prTitle) patch.prTitle = meta.title;
7966
+ if (Object.keys(patch).length > 0) {
7967
+ updateThread(thread.id, patch);
7968
+ const latest = this.requireThread(thread.id);
7969
+ if (!latest.userSetTitle && meta.title && latest.title !== meta.title) {
7970
+ updateThread(thread.id, { title: meta.title });
7971
+ }
7972
+ }
7973
+ }
7974
+ return meta;
7975
+ }
7829
7976
  async getPrDetails(threadRef) {
7830
7977
  const { thread, selector, cwd } = await this.withPrSelector(threadRef);
7831
7978
  if (!selector) return null;
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  startMcpServer
4
- } from "../chunk-E4PWXO2C.js";
5
- import "../chunk-TLJH3L2C.js";
6
- import "../chunk-2M4OHXYX.js";
7
- import "../chunk-2R5VV4BA.js";
8
- import "../chunk-WMCPLDW3.js";
4
+ } from "../chunk-MAWKQA2Y.js";
5
+ import "../chunk-MGSJQMJA.js";
6
+ import "../chunk-3OJG4LP4.js";
7
+ import "../chunk-TNIAXABV.js";
8
+ import "../chunk-MEI4AXV4.js";
9
9
  import "../chunk-ILQK4P5R.js";
10
10
  import "../chunk-3DKGI32Q.js";
11
11
  import "../chunk-3WF3X46L.js";
12
- import "../chunk-LL7DTZ5B.js";
12
+ import "../chunk-L44AX7IG.js";
13
13
  import "../chunk-HYRHI3QU.js";
14
14
  import "../chunk-M37RITA6.js";
15
15
  import "../chunk-AJ6ROGD7.js";
@@ -4,10 +4,10 @@ import {
4
4
  listWorkspaces,
5
5
  removeWorkspace,
6
6
  syncWorkspacesFromThreads
7
- } from "./chunk-TLJH3L2C.js";
8
- import "./chunk-2M4OHXYX.js";
9
- import "./chunk-2R5VV4BA.js";
10
- import "./chunk-LL7DTZ5B.js";
7
+ } from "./chunk-MGSJQMJA.js";
8
+ import "./chunk-3OJG4LP4.js";
9
+ import "./chunk-TNIAXABV.js";
10
+ import "./chunk-L44AX7IG.js";
11
11
  import "./chunk-HYRHI3QU.js";
12
12
  import "./chunk-M37RITA6.js";
13
13
  import "./chunk-AJ6ROGD7.js";
@@ -13,6 +13,7 @@ import {
13
13
  getPr,
14
14
  getPrChecks,
15
15
  getPrDetails,
16
+ getPrMeta,
16
17
  isDirty,
17
18
  isPlaceholderBranch,
18
19
  listBranches,
@@ -35,7 +36,7 @@ import {
35
36
  worktreeDisplayLabel,
36
37
  worktreeDisplayLabelForGroup,
37
38
  worktreeNameFromPath
38
- } from "./chunk-LL7DTZ5B.js";
39
+ } from "./chunk-L44AX7IG.js";
39
40
  import "./chunk-HYRHI3QU.js";
40
41
  import "./chunk-M37RITA6.js";
41
42
  import "./chunk-AJ6ROGD7.js";
@@ -54,6 +55,7 @@ export {
54
55
  getPr,
55
56
  getPrChecks,
56
57
  getPrDetails,
58
+ getPrMeta,
57
59
  isDirty,
58
60
  isPlaceholderBranch,
59
61
  listBranches,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideboard-ai/core",
3
- "version": "0.1.10",
3
+ "version": "0.1.15",
4
4
  "description": "Sideboard core — orchestration, agents, git worktrees, MCP server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",