@sideboard-ai/core 0.1.174 → 0.1.176

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-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-ZWYRGFZB.js → agents-544IX5KA.js} +8 -6
  6. package/dist/{agents-LMPVUPOH.js → agents-UENEQ6J2.js} +7 -5
  7. package/dist/{chunk-ZY7K4T37.js → chunk-3ZFGZ7RT.js} +5 -5
  8. package/dist/{chunk-HJPGIETB.js → chunk-4ELBAYFW.js} +19 -14
  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-VCVBICMZ.js → chunk-FJWQCZ74.js} +5 -5
  12. package/dist/{chunk-LZ6QMEQC.js → chunk-HVIEYTUK.js} +1 -1
  13. package/dist/{chunk-XD2BAANL.js → chunk-IEEAVWAP.js} +6 -6
  14. package/dist/{chunk-YEPVWJ3R.js → chunk-JUA7XEXR.js} +16 -11
  15. package/dist/{chunk-ELBYOGVA.js → chunk-N7WZ6NIN.js} +10 -1
  16. package/dist/{chunk-CUA4S537.js → chunk-NIB6BTC6.js} +9 -5
  17. package/dist/{chunk-XXIH6XYR.js → chunk-NQTKRAUF.js} +167 -35
  18. package/dist/{chunk-CMJ2FBBV.js → chunk-RE2YWFUQ.js} +1 -1
  19. package/dist/{chunk-6GN5WPYZ.js → chunk-VKQGAWHY.js} +10 -1
  20. package/dist/{chunk-TPPZXZTA.js → chunk-W44EKPIR.js} +228 -95
  21. package/dist/{chunk-S42XV45P.js → chunk-Y4MIXGPA.js} +1 -1
  22. package/dist/{connected-teams-DBWAMP7G.js → connected-teams-ON2KIKQX.js} +3 -3
  23. package/dist/{connected-teams-WGONUQOF.js → connected-teams-WOYCH7FR.js} +3 -3
  24. package/dist/{coordinator-prompt-K3HXEPFD.js → coordinator-prompt-BE2FERYE.js} +1 -1
  25. package/dist/{coordinator-prompt-LJKA2ODR.js → coordinator-prompt-PRM5ARWG.js} +1 -1
  26. package/dist/{global-workspace-VDFSU3DD.js → global-workspace-3HIWNQ3B.js} +1 -1
  27. package/dist/{global-workspace-KA7T26F5.js → global-workspace-J737XNUX.js} +1 -1
  28. package/dist/index.cjs +584 -379
  29. package/dist/index.d.cts +53 -10
  30. package/dist/index.d.ts +53 -10
  31. package/dist/index.js +76 -27
  32. package/dist/mcp/run-stdio.cjs +778 -576
  33. package/dist/mcp/run-stdio.js +78 -27
  34. package/dist/{oauth-A7XXI2TM.js → oauth-6ZQ4Q4XN.js} +2 -2
  35. package/dist/{oauth-YJBAURIJ.js → oauth-O7UGLZOY.js} +2 -2
  36. package/dist/{orchestrator-DMSSC4SV.js → orchestrator-2KZD7N4X.js} +6 -6
  37. package/dist/{orchestrator-VMUZJFTZ.js → orchestrator-GDKEVLFK.js} +7 -7
  38. package/dist/{workspaces-GOGBPATJ.js → workspaces-DR4UNOQC.js} +1 -1
  39. package/dist/{workspaces-UR7YEFMZ.js → workspaces-ULHYXM4Y.js} +1 -1
  40. package/package.json +1 -1
@@ -16,8 +16,8 @@ import {
16
16
  toAbleTimeIssueInfo,
17
17
  updateAbleTimeTask,
18
18
  verifyAbleTimeConnection
19
- } from "./chunk-AQPVBVJE.js";
20
- import "./chunk-6GN5WPYZ.js";
19
+ } from "./chunk-BBNUL4IE.js";
20
+ import "./chunk-VKQGAWHY.js";
21
21
  import "./chunk-OKZFTOM2.js";
22
22
  import "./chunk-NSTQ6QKD.js";
23
23
  import "./chunk-KGZBYWZ3.js";
@@ -14,8 +14,8 @@ import {
14
14
  toAbleTimeIssueInfo,
15
15
  updateAbleTimeTask,
16
16
  verifyAbleTimeConnection
17
- } from "./chunk-CMJ2FBBV.js";
18
- import "./chunk-ELBYOGVA.js";
17
+ } from "./chunk-RE2YWFUQ.js";
18
+ import "./chunk-N7WZ6NIN.js";
19
19
  import "./chunk-J7LQVLFQ.js";
20
20
  import "./chunk-4TR3HZFT.js";
21
21
  import "./chunk-JT7R45JB.js";
@@ -1,9 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
3
25
 
4
26
  // src/agents/cursor-runner.ts
5
27
  var import_sdk = require("@cursor/sdk");
6
- var import_node_fs11 = require("fs");
28
+ var import_node_fs12 = require("fs");
7
29
  var import_node_readline2 = require("readline");
8
30
 
9
31
  // src/hook/nested-electron-env.ts
@@ -24,36 +46,75 @@ var STRIP_NESTED_ELECTRON_THEN_EXEC = [
24
46
  ].join("; ");
25
47
 
26
48
  // src/agents/cursor-ripgrep.ts
27
- var import_node_fs6 = require("fs");
49
+ var import_node_fs11 = require("fs");
28
50
  var import_node_module = require("module");
29
- var import_node_path6 = require("path");
51
+ var import_node_path12 = require("path");
30
52
 
31
53
  // src/agents/node-launch.ts
54
+ var import_node_fs10 = require("fs");
55
+ var import_node_os5 = require("os");
56
+ var import_node_path11 = require("path");
57
+
58
+ // src/http/system-ca.ts
59
+ var import_node_child_process = require("child_process");
32
60
  var import_node_fs5 = require("fs");
33
- var import_node_os3 = require("os");
61
+ var import_node_path6 = require("path");
62
+ var import_node_tls = __toESM(require("tls"), 1);
63
+
64
+ // src/store/paths.ts
65
+ var import_node_path4 = require("path");
66
+ var import_node_os2 = require("os");
34
67
  var import_node_path5 = require("path");
68
+ var import_node_fs4 = require("fs");
35
69
 
36
- // src/git/run.ts
37
- var import_execa = require("execa");
70
+ // src/hook/settings.ts
71
+ var import_node_fs3 = require("fs");
72
+ var import_node_os = require("os");
73
+ var import_node_path3 = require("path");
74
+ var import_smol_toml = require("smol-toml");
38
75
 
39
- // src/agents/path.ts
76
+ // src/hook/convention-setup.ts
40
77
  var import_node_fs = require("fs");
41
- var import_node_child_process = require("child_process");
42
- var import_node_os = require("os");
43
78
  var import_node_path = require("path");
44
79
 
45
- // src/git/github-agent-auth.ts
80
+ // src/hook/cursor-worktrees.ts
46
81
  var import_node_fs2 = require("fs");
47
- var import_node_os2 = require("os");
48
82
  var import_node_path2 = require("path");
83
+ var import_execa = require("execa");
84
+ var import_node_readline = require("readline");
85
+
86
+ // src/store/paths.ts
87
+ function appDataDir() {
88
+ const override = process.env.SIDEBOARD_APP_DATA?.trim();
89
+ const base = override ? override : process.platform === "darwin" ? (0, import_node_path5.join)((0, import_node_os2.homedir)(), "Library", "Application Support", "sideboard") : process.platform === "win32" ? (0, import_node_path5.join)(process.env.APPDATA ?? (0, import_node_path5.join)((0, import_node_os2.homedir)(), "AppData", "Roaming"), "sideboard") : (0, import_node_path5.join)((0, import_node_os2.homedir)(), ".local", "share", "sideboard");
90
+ (0, import_node_fs4.mkdirSync)(base, { recursive: true });
91
+ return base;
92
+ }
93
+
94
+ // src/http/system-ca.ts
95
+ var BUNDLE_MAX_AGE_MS = 24 * 60 * 60 * 1e3;
96
+
97
+ // src/git/run.ts
98
+ var import_execa2 = require("execa");
99
+
100
+ // src/agents/path.ts
101
+ var import_node_fs6 = require("fs");
102
+ var import_node_child_process2 = require("child_process");
103
+ var import_node_os3 = require("os");
104
+ var import_node_path7 = require("path");
105
+
106
+ // src/git/github-agent-auth.ts
107
+ var import_node_fs7 = require("fs");
108
+ var import_node_os4 = require("os");
109
+ var import_node_path8 = require("path");
49
110
 
50
111
  // src/git/stale-lock.ts
51
- var import_node_fs3 = require("fs");
52
- var import_node_path3 = require("path");
112
+ var import_node_fs8 = require("fs");
113
+ var import_node_path9 = require("path");
53
114
 
54
115
  // src/agents/packaged-runtime.ts
55
- var import_node_fs4 = require("fs");
56
- var import_node_path4 = require("path");
116
+ var import_node_fs9 = require("fs");
117
+ var import_node_path10 = require("path");
57
118
  function electronResourcesPath() {
58
119
  const resources = process.resourcesPath;
59
120
  if (typeof resources !== "string" || !resources) return null;
@@ -62,14 +123,14 @@ function electronResourcesPath() {
62
123
  function packagedCursorRuntimeDir() {
63
124
  const resources = electronResourcesPath();
64
125
  if (!resources) return null;
65
- const dir = (0, import_node_path4.join)(resources, "cursor-runtime");
66
- if (!(0, import_node_fs4.existsSync)((0, import_node_path4.join)(dir, "core-dist", "agents", "cursor-runner.js"))) return null;
126
+ const dir = (0, import_node_path10.join)(resources, "cursor-runtime");
127
+ if (!(0, import_node_fs9.existsSync)((0, import_node_path10.join)(dir, "core-dist", "agents", "cursor-runner.js"))) return null;
67
128
  return dir;
68
129
  }
69
130
  function packagedCursorRipgrepCandidate(platformPkg, binName) {
70
131
  const dir = packagedCursorRuntimeDir();
71
132
  if (!dir) return null;
72
- return (0, import_node_path4.join)(dir, "node_modules", platformPkg, "bin", binName);
133
+ return (0, import_node_path10.join)(dir, "node_modules", platformPkg, "bin", binName);
73
134
  }
74
135
 
75
136
  // src/agents/node-launch.ts
@@ -81,7 +142,7 @@ function unpackedAsarPath(filePath) {
81
142
  if (!isAsarPath(filePath)) return null;
82
143
  const unpacked = filePath.replace(/\.asar(?=[/\\])/, ".asar.unpacked");
83
144
  if (unpacked === filePath) return null;
84
- return (0, import_node_fs5.existsSync)(unpacked) ? unpacked : null;
145
+ return (0, import_node_fs10.existsSync)(unpacked) ? unpacked : null;
85
146
  }
86
147
  function nodeReadableScriptPath(scriptPath) {
87
148
  return unpackedAsarPath(scriptPath) ?? scriptPath;
@@ -97,21 +158,21 @@ function platformRipgrepPackage() {
97
158
  }
98
159
  function usableRipgrepPath(candidate) {
99
160
  const raw = candidate?.trim();
100
- if (!raw || !(0, import_node_path6.isAbsolute)(raw)) return null;
161
+ if (!raw || !(0, import_node_path12.isAbsolute)(raw)) return null;
101
162
  const readable = nodeReadableScriptPath(raw);
102
- if (!(0, import_node_fs6.existsSync)(readable) || isAsarPath(readable)) return null;
163
+ if (!(0, import_node_fs11.existsSync)(readable) || isAsarPath(readable)) return null;
103
164
  return readable;
104
165
  }
105
166
  function walkForBundledRipgrep(startFile) {
106
167
  if (!startFile) return null;
107
168
  const pkg = platformRipgrepPackage();
108
169
  const name = rgBinaryName();
109
- let dir = (0, import_node_path6.dirname)((0, import_node_path6.resolve)(startFile));
110
- const root = (0, import_node_path6.parse)(dir).root;
170
+ let dir = (0, import_node_path12.dirname)((0, import_node_path12.resolve)(startFile));
171
+ const root = (0, import_node_path12.parse)(dir).root;
111
172
  while (dir !== root) {
112
- const hit = usableRipgrepPath((0, import_node_path6.join)(dir, "node_modules", pkg, "bin", name));
173
+ const hit = usableRipgrepPath((0, import_node_path12.join)(dir, "node_modules", pkg, "bin", name));
113
174
  if (hit) return hit;
114
- const next = (0, import_node_path6.dirname)(dir);
175
+ const next = (0, import_node_path12.dirname)(dir);
115
176
  if (next === dir) break;
116
177
  dir = next;
117
178
  }
@@ -121,7 +182,7 @@ function requireResolveBundledRipgrep(fromFile) {
121
182
  try {
122
183
  const req = (0, import_node_module.createRequire)(fromFile);
123
184
  const pkgJson = req.resolve(`${platformRipgrepPackage()}/package.json`);
124
- return usableRipgrepPath((0, import_node_path6.join)((0, import_node_path6.dirname)(pkgJson), "bin", rgBinaryName()));
185
+ return usableRipgrepPath((0, import_node_path12.join)((0, import_node_path12.dirname)(pkgJson), "bin", rgBinaryName()));
125
186
  } catch {
126
187
  return null;
127
188
  }
@@ -147,45 +208,13 @@ function ensureCursorRipgrepPath(opts) {
147
208
  }
148
209
 
149
210
  // src/agents/cursor-store.ts
150
- var import_node_path12 = require("path");
151
-
152
- // src/store/paths.ts
153
- var import_node_path10 = require("path");
154
- var import_node_os5 = require("os");
155
- var import_node_path11 = require("path");
156
- var import_node_fs10 = require("fs");
157
-
158
- // src/hook/settings.ts
159
- var import_node_fs9 = require("fs");
160
- var import_node_os4 = require("os");
161
- var import_node_path9 = require("path");
162
- var import_smol_toml = require("smol-toml");
163
-
164
- // src/hook/convention-setup.ts
165
- var import_node_fs7 = require("fs");
166
- var import_node_path7 = require("path");
167
-
168
- // src/hook/cursor-worktrees.ts
169
- var import_node_fs8 = require("fs");
170
- var import_node_path8 = require("path");
171
- var import_execa2 = require("execa");
172
- var import_node_readline = require("readline");
173
-
174
- // src/store/paths.ts
175
- function appDataDir() {
176
- const override = process.env.SIDEBOARD_APP_DATA?.trim();
177
- const base = override ? override : process.platform === "darwin" ? (0, import_node_path11.join)((0, import_node_os5.homedir)(), "Library", "Application Support", "sideboard") : process.platform === "win32" ? (0, import_node_path11.join)(process.env.APPDATA ?? (0, import_node_path11.join)((0, import_node_os5.homedir)(), "AppData", "Roaming"), "sideboard") : (0, import_node_path11.join)((0, import_node_os5.homedir)(), ".local", "share", "sideboard");
178
- (0, import_node_fs10.mkdirSync)(base, { recursive: true });
179
- return base;
180
- }
181
-
182
- // src/agents/cursor-store.ts
211
+ var import_node_path13 = require("path");
183
212
  var CURSOR_SDK_STORE_DIR = "cursor-sdk-store";
184
213
  function cursorSdkStoreDir(threadId) {
185
- const root = (0, import_node_path12.join)(appDataDir(), CURSOR_SDK_STORE_DIR);
214
+ const root = (0, import_node_path13.join)(appDataDir(), CURSOR_SDK_STORE_DIR);
186
215
  const id = sanitizeCursorStoreSegment(threadId);
187
216
  if (!id) return root;
188
- return (0, import_node_path12.join)(root, "threads", id);
217
+ return (0, import_node_path13.join)(root, "threads", id);
189
218
  }
190
219
  function sanitizeCursorStoreSegment(threadId) {
191
220
  return (threadId ?? "").trim().replace(/[^a-zA-Z0-9._-]/g, "_");
@@ -712,7 +741,7 @@ function modelSelection(model, opts) {
712
741
  }
713
742
  function localAgentStore(threadId) {
714
743
  const root = cursorSdkStoreDir(threadId);
715
- (0, import_node_fs11.mkdirSync)(root, { recursive: true });
744
+ (0, import_node_fs12.mkdirSync)(root, { recursive: true });
716
745
  return new import_sdk.JsonlLocalAgentStore(root);
717
746
  }
718
747
  async function cancelStaleLocalRuns(agentId, opts) {
@@ -12,7 +12,7 @@ import {
12
12
  ensureCursorRipgrepPath,
13
13
  fetchCursorTurnCostUsd,
14
14
  formatUnknownDetail
15
- } from "../chunk-XXIH6XYR.js";
15
+ } from "../chunk-NQTKRAUF.js";
16
16
  import {
17
17
  dropNestedElectronEnvFromProcess
18
18
  } from "../chunk-4TR3HZFT.js";
@@ -12,6 +12,7 @@ import {
12
12
  getAgentSetupInfo,
13
13
  installAgent,
14
14
  installNpmGlobalPackage,
15
+ isCursorApiKeyConfigured,
15
16
  isCursorAutoModel,
16
17
  isSessionQuotaLimit,
17
18
  listAgentSetupInfo,
@@ -31,19 +32,19 @@ import {
31
32
  resolveLoginCommand,
32
33
  resolveQuotaFallbackAgent,
33
34
  whichOnPath
34
- } from "./chunk-CUA4S537.js";
35
- import "./chunk-ZY7K4T37.js";
35
+ } from "./chunk-NIB6BTC6.js";
36
+ import "./chunk-3ZFGZ7RT.js";
36
37
  import "./chunk-7JIYKYLL.js";
37
38
  import "./chunk-6K64FJDD.js";
38
- import "./chunk-XD2BAANL.js";
39
- import "./chunk-M267JPEA.js";
40
- import "./chunk-ELBYOGVA.js";
39
+ import "./chunk-IEEAVWAP.js";
40
+ import "./chunk-AN3THU7F.js";
41
+ import "./chunk-N7WZ6NIN.js";
41
42
  import {
42
43
  cursorSdkMessageToEvents,
43
44
  parseCursorRunnerLine,
44
45
  preferredCursorCostCents,
45
46
  turnCostUsdFromCursorUsage
46
- } from "./chunk-XXIH6XYR.js";
47
+ } from "./chunk-NQTKRAUF.js";
47
48
  import {
48
49
  ORCHESTRATOR_AGENT_KINDS,
49
50
  assertOrchestratorCapableAgent,
@@ -87,6 +88,7 @@ export {
87
88
  installAgent,
88
89
  installNpmGlobalPackage,
89
90
  isConductorBundledCli,
91
+ isCursorApiKeyConfigured,
90
92
  isCursorAutoModel,
91
93
  isOrchestratorCapableAgent,
92
94
  isSessionQuotaLimit,
@@ -15,6 +15,7 @@ import {
15
15
  getAgentSetupInfo,
16
16
  installAgent,
17
17
  installNpmGlobalPackage,
18
+ isCursorApiKeyConfigured,
18
19
  isCursorAutoModel,
19
20
  isSessionQuotaLimit,
20
21
  listAgentSetupInfo,
@@ -37,11 +38,11 @@ import {
37
38
  resolveQuotaFallbackAgent,
38
39
  turnCostUsdFromCursorUsage,
39
40
  whichOnPath
40
- } from "./chunk-TPPZXZTA.js";
41
- import "./chunk-LZ6QMEQC.js";
42
- import "./chunk-S42XV45P.js";
43
- import "./chunk-6GN5WPYZ.js";
44
- import "./chunk-VCVBICMZ.js";
41
+ } from "./chunk-W44EKPIR.js";
42
+ import "./chunk-HVIEYTUK.js";
43
+ import "./chunk-Y4MIXGPA.js";
44
+ import "./chunk-VKQGAWHY.js";
45
+ import "./chunk-FJWQCZ74.js";
45
46
  import "./chunk-7O53GXTA.js";
46
47
  import "./chunk-D6JWYJ4P.js";
47
48
  import "./chunk-LZQULFIT.js";
@@ -86,6 +87,7 @@ export {
86
87
  installAgent,
87
88
  installNpmGlobalPackage,
88
89
  isConductorBundledCli,
90
+ isCursorApiKeyConfigured,
89
91
  isCursorAutoModel,
90
92
  isOrchestratorCapableAgent,
91
93
  isSessionQuotaLimit,
@@ -390,7 +390,7 @@ var COORDINATOR_TOOL_PLAYBOOK = [
390
390
  "Workspaces:",
391
391
  "- add_workspace / remove_workspace \u2014 register or unregister a git repo",
392
392
  "Worktree threads (chats):",
393
- "- 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)",
393
+ "- 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 would be Codex) can deadlock on ~/.codex locks \u2014 omit agent; Sideboard switches the child to Cursor when a CURSOR_API_KEY is set, otherwise keeps the Account default",
394
394
  "- start_board_card \u2014 same as create_thread for a ticket/PR/named branch (attaches issue text when resolvable). Then send_to_thread.",
395
395
  "- 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.",
396
396
  "- 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.",
@@ -405,9 +405,9 @@ var COORDINATOR_TOOL_PLAYBOOK = [
405
405
  "- get_diff \u2014 compact diff summary",
406
406
  "- get_pr_checks \u2014 snapshot of a worktree thread's PR checks (null = no PR). Use this to inspect status. If the user gave a goal, the worktree agent watches with `gh pr checks --watch` \u2014 do not poll for the human.",
407
407
  '- request_review \u2014 open a Review chat tab on a worktree thread (attaches .claude/skills/review/SKILL.md when present, else .context/review.md copied from .sideboard/review.md / stock; sends "Review changes in this workspace."); then wait_for_turn (loop while stillRunning) / get_turn_result on the returned id',
408
- "- ask_git \u2014 commit & push, open a draft PR, resolve conflicts, or merge. When the worktree is clean, Sideboard pushes / opens the PR itself. When dirty, it queues the worktree agent \u2014 then wait_for_turn (loop while stillRunning). Prefer this over paraphrasing. If ask_git / get_thread lastError says the GraphQL/PR body is too long, the branch is already pushed \u2014 send_to_thread so the worktree agent runs `gh pr create --body-file` with a short description. Do not invent SSH or auth failures from that error. If the user gave a goal (Greptile 5/5, CI green), send_to_thread that goal so the worktree agent enters the watch-fix-push loop \u2014 do not tell the human to poll.",
408
+ "- ask_git \u2014 commit & push, open a draft PR, mark ready for review, resolve conflicts, or merge. When the worktree is clean, Sideboard pushes / opens the PR itself. When dirty, it queues the worktree agent \u2014 then wait_for_turn (loop while stillRunning). Prefer this over paraphrasing. If ask_git / get_thread lastError says the GraphQL/PR body is too long, the branch is already pushed \u2014 send_to_thread so the worktree agent runs `gh pr create --body-file` with a short description. Do not invent SSH or auth failures from that error. If the user gave a goal (Greptile 5/5, CI green), send_to_thread that goal so the worktree agent enters the watch-fix-push loop \u2014 do not tell the human to poll.",
409
409
  '- Merge (`ask_git` action=merge / send_to_thread "Merge PR.") only when the user explicitly asked to merge that PR. Do not merge because the work looks done, CI is green, or a typical flow includes it.',
410
- '- Or send_to_thread with those exact phrases: "Commit and push.", "Commit, push, and open a draft PR.", "Merge the remote branch (main) into your branch and resolve conflicts. Then, commit and push your changes.", "Merge PR." (draft PRs: `gh pr create --draft -R <origin-owner/name>` using the workspace `github:` slug \u2014 never upstream). Never run git/gh from this orchestration cwd, and never merge the PR yourself.',
410
+ '- Or send_to_thread with those exact phrases: "Commit and push.", "Commit, push, and open a draft PR.", "Ready for review.", "Merge the remote branch (main) into your branch and resolve conflicts. Then, commit and push your changes.", "Merge PR." (draft PRs: `gh pr create --draft -R <origin-owner/name>` using the workspace `github:` slug \u2014 never upstream). Never run git/gh from this orchestration cwd, and never merge the PR yourself.',
411
411
  "Process guides:",
412
412
  "- Long child jobs (pack, test, deploy, anything that may run more than ~30s): workers always have `/long-running` (Sideboard product skill). Tell them to detach and wait; they may `stop_job` if it hangs or is doing the wrong thing; do not ask the human to poll.",
413
413
  "- Recurring multi-item / fan-out: if the child worktree has `.claude/skills/graph-engineering/SKILL.md`, tell the worker to follow it (`/graph-engineering`). Judge first; state on disk; grow the rulebook; do not patch three threads.",
@@ -531,8 +531,8 @@ function ensureGlobalCoordinatorCwd(opts) {
531
531
  "",
532
532
  "When creating threads, pass `repoPath` from `list_workspaces` (or the path you just registered).",
533
533
  orchId ? `Pass parentThreadId="${orchId}" (or omit it). Never invent another parentThreadId.` : "Pass `parentThreadId` for children (this chat's id from the turn reminder).",
534
- "Omit `agent` / `model` on `create_thread` unless you have a reason to override Account defaults.",
535
- "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.",
534
+ "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.",
535
+ "Never pass `agent=codex` when you yourself are Codex \u2014 nested Codex can deadlock on shared ~/.codex locks. Omit agent; Sideboard applies Account defaults, and switches that nested-Codex case to Cursor only when a CURSOR_API_KEY is configured.",
536
536
  "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).",
537
537
  "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.",
538
538
  "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.",
@@ -24,7 +24,7 @@ import {
24
24
  stripBrightsyNdjsonNoise,
25
25
  sumUsageList,
26
26
  toolDescription
27
- } from "./chunk-CUA4S537.js";
27
+ } from "./chunk-NIB6BTC6.js";
28
28
  import {
29
29
  SLACK_REPLY_FORMATTING,
30
30
  addWorkspace,
@@ -47,7 +47,7 @@ import {
47
47
  stageAbsolutePathsAsAttachments,
48
48
  stageBuffersAsAttachments,
49
49
  syncWorkspacesFromThreads
50
- } from "./chunk-ZY7K4T37.js";
50
+ } from "./chunk-3ZFGZ7RT.js";
51
51
  import {
52
52
  addPrStackLayer,
53
53
  allocateTeamName,
@@ -106,7 +106,7 @@ import {
106
106
  } from "./chunk-6K64FJDD.js";
107
107
  import {
108
108
  httpFetch
109
- } from "./chunk-ELBYOGVA.js";
109
+ } from "./chunk-N7WZ6NIN.js";
110
110
  import {
111
111
  createAgentStreamCoalescer
112
112
  } from "./chunk-AXQ4ZWHK.js";
@@ -124,7 +124,7 @@ import {
124
124
  shouldRetryFailedAgentTurn,
125
125
  summarizeTurnStderr,
126
126
  turnFailChatText
127
- } from "./chunk-XXIH6XYR.js";
127
+ } from "./chunk-NQTKRAUF.js";
128
128
  import {
129
129
  assertOrchestratorCapableAgent,
130
130
  childEnvWithAppSettings,
@@ -466,7 +466,7 @@ async function continueSourceThread(threadId, prompt) {
466
466
  await continueOnReply(threadId, prompt);
467
467
  return;
468
468
  }
469
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-VMUZJFTZ.js");
469
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-GDKEVLFK.js");
470
470
  await getOrchestrator2().send(threadId, prompt);
471
471
  } catch {
472
472
  }
@@ -800,9 +800,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
800
800
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
801
801
  );
802
802
  }
803
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-VDFSU3DD.js");
803
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-3HIWNQ3B.js");
804
804
  if (isGlobalThread2(thread)) {
805
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-LJKA2ODR.js");
805
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-PRM5ARWG.js");
806
806
  ensureGlobalCoordinatorCwd2(
807
807
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
808
808
  );
@@ -997,6 +997,7 @@ var AGENT_GIT_ACTIONS = [
997
997
  "create-draft",
998
998
  "create-web",
999
999
  "resolve-conflicts",
1000
+ "ready-for-review",
1000
1001
  "merge"
1001
1002
  ];
1002
1003
  function agentGitPrompt(action, opts) {
@@ -1012,6 +1013,8 @@ function agentGitPrompt(action, opts) {
1012
1013
  const named = base ? ` (${base})` : "";
1013
1014
  return `Merge the remote branch${named} into your branch and resolve conflicts. Then, commit and push your changes.`;
1014
1015
  }
1016
+ case "ready-for-review":
1017
+ return "Ready for review.";
1015
1018
  case "merge":
1016
1019
  return "Merge PR.";
1017
1020
  }
@@ -1027,6 +1030,8 @@ function gitActionExpansion(action, base) {
1027
1030
  return "Commit, push, then `gh pr create --web -R <origin-owner/name>`.";
1028
1031
  case "resolve-conflicts":
1029
1032
  return `Fetch the PR base${base ? ` (\`${base}\`)` : ""}, merge it into this branch, resolve conflicts carefully, then commit and push until the PR is mergeable.`;
1033
+ case "ready-for-review":
1034
+ return "This phrase is the explicit ask to mark this thread's draft pull request ready for review on GitHub (`gh pr ready -R <origin-owner/name>` or `gh pr ready`). Update title/body if the purpose drifted. Do not merge.";
1030
1035
  case "merge":
1031
1036
  return "This phrase is the explicit ask to merge this thread's open pull request on GitHub. If `gh stack view` shows a stack, use `gh stack merge`; otherwise `gh pr merge` (respect repo defaults / squash vs merge). Do not force-push main/master or merge locally into the main checkout.";
1032
1037
  }
@@ -3684,7 +3689,7 @@ async function createThread(input, _onSetupLine) {
3684
3689
  let sourceIsFork = false;
3685
3690
  if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
3686
3691
  if (isAbleTimeConnected() && getIssueSource() === "abletime") {
3687
- const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-7VW4EGPT.js");
3692
+ const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-INEHQH6K.js");
3688
3693
  const task = await ensureAbleTimeTask({
3689
3694
  title: title?.trim() || "Untitled work",
3690
3695
  description: input.prompt?.trim() || void 0
@@ -3782,7 +3787,7 @@ async function createThread(input, _onSetupLine) {
3782
3787
  return readThread(thread.id) ?? thread;
3783
3788
  }
3784
3789
  async function listLinearIssues(agent, repoPath) {
3785
- const { getAdapter: getAdapter2 } = await import("./agents-ZWYRGFZB.js");
3790
+ const { getAdapter: getAdapter2 } = await import("./agents-544IX5KA.js");
3786
3791
  await requireAgent(agent, { requireLinear: true });
3787
3792
  const adapter = getAdapter2(agent);
3788
3793
  if (!adapter.listLinearIssues) {
@@ -4204,7 +4209,7 @@ async function adoptThread(input) {
4204
4209
  messages: input.messages ?? []
4205
4210
  });
4206
4211
  writeThread(thread);
4207
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-UR7YEFMZ.js");
4212
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-ULHYXM4Y.js");
4208
4213
  await ensureWorkspace2(repoPath);
4209
4214
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-X54WSOXM.js");
4210
4215
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -5998,7 +6003,7 @@ function formatWorktreeDirective(thread, opts) {
5998
6003
  );
5999
6004
  }
6000
6005
  lines.push(
6001
- '- Sideboard git buttons send short phrases ("Commit and push.", "Merge PR.", \u2026) with their meaning attached \u2014 act on them without asking for clarification. If the user gives a goal (Greptile 5/5, CI green, until checks pass), you get the watch-fix-push playbook with that request.'
6006
+ '- Sideboard git buttons send short phrases ("Commit and push.", "Ready for review.", "Merge PR.", \u2026) with their meaning attached \u2014 act on them without asking for clarification. If the user gives a goal (Greptile 5/5, CI green, until checks pass), you get the watch-fix-push playbook with that request.'
6002
6007
  );
6003
6008
  lines.push("");
6004
6009
  lines.push(formatProcessGuideDirective({ worktreePath: thread.worktreePath }));
@@ -6686,7 +6691,7 @@ function formatScheduledPrompt(name, prompt) {
6686
6691
  ${prompt}`;
6687
6692
  }
6688
6693
  async function defaultDeps() {
6689
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-VMUZJFTZ.js");
6694
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-GDKEVLFK.js");
6690
6695
  const orch = getOrchestrator2();
6691
6696
  return {
6692
6697
  findThread: (id) => findThreadByRef(id),
@@ -8604,7 +8609,7 @@ var Orchestrator = class {
8604
8609
  "ask_git targets a worktree agent thread (not the orchestrator). Pass a child/worktree thread ref."
8605
8610
  );
8606
8611
  }
8607
- if (action === "merge" && !thread.prUrl) {
8612
+ if ((action === "merge" || action === "ready-for-review") && !thread.prUrl) {
8608
8613
  throw new Error(
8609
8614
  "No pull request linked. Ask the worktree agent to open a draft PR first (ask_git create-draft)."
8610
8615
  );
@@ -8772,7 +8777,7 @@ var Orchestrator = class {
8772
8777
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
8773
8778
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
8774
8779
  try {
8775
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-UR7YEFMZ.js");
8780
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-ULHYXM4Y.js");
8776
8781
  await ensureWorkspace2(thread.repoPath);
8777
8782
  } catch {
8778
8783
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  formatFetchError
3
- } from "./chunk-ELBYOGVA.js";
3
+ } from "./chunk-N7WZ6NIN.js";
4
4
 
5
5
  // src/brightsy/config.ts
6
6
  import { existsSync, readFileSync, writeFileSync } from "fs";
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  httpFetch
5
- } from "./chunk-6GN5WPYZ.js";
5
+ } from "./chunk-VKQGAWHY.js";
6
6
  import {
7
7
  getAbleTimeAccessToken,
8
8
  getAbleTimeHost,
@@ -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 would be Codex) can deadlock on ~/.codex locks \u2014 omit agent; Sideboard switches the child to Cursor when a CURSOR_API_KEY is set, otherwise keeps the Account default",
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.",
@@ -360,9 +360,9 @@ var COORDINATOR_TOOL_PLAYBOOK = [
360
360
  "- get_diff \u2014 compact diff summary",
361
361
  "- get_pr_checks \u2014 snapshot of a worktree thread's PR checks (null = no PR). Use this to inspect status. If the user gave a goal, the worktree agent watches with `gh pr checks --watch` \u2014 do not poll for the human.",
362
362
  '- request_review \u2014 open a Review chat tab on a worktree thread (attaches .claude/skills/review/SKILL.md when present, else .context/review.md copied from .sideboard/review.md / stock; sends "Review changes in this workspace."); then wait_for_turn (loop while stillRunning) / get_turn_result on the returned id',
363
- "- ask_git \u2014 commit & push, open a draft PR, resolve conflicts, or merge. When the worktree is clean, Sideboard pushes / opens the PR itself. When dirty, it queues the worktree agent \u2014 then wait_for_turn (loop while stillRunning). Prefer this over paraphrasing. If ask_git / get_thread lastError says the GraphQL/PR body is too long, the branch is already pushed \u2014 send_to_thread so the worktree agent runs `gh pr create --body-file` with a short description. Do not invent SSH or auth failures from that error. If the user gave a goal (Greptile 5/5, CI green), send_to_thread that goal so the worktree agent enters the watch-fix-push loop \u2014 do not tell the human to poll.",
363
+ "- ask_git \u2014 commit & push, open a draft PR, mark ready for review, resolve conflicts, or merge. When the worktree is clean, Sideboard pushes / opens the PR itself. When dirty, it queues the worktree agent \u2014 then wait_for_turn (loop while stillRunning). Prefer this over paraphrasing. If ask_git / get_thread lastError says the GraphQL/PR body is too long, the branch is already pushed \u2014 send_to_thread so the worktree agent runs `gh pr create --body-file` with a short description. Do not invent SSH or auth failures from that error. If the user gave a goal (Greptile 5/5, CI green), send_to_thread that goal so the worktree agent enters the watch-fix-push loop \u2014 do not tell the human to poll.",
364
364
  '- Merge (`ask_git` action=merge / send_to_thread "Merge PR.") only when the user explicitly asked to merge that PR. Do not merge because the work looks done, CI is green, or a typical flow includes it.',
365
- '- Or send_to_thread with those exact phrases: "Commit and push.", "Commit, push, and open a draft PR.", "Merge the remote branch (main) into your branch and resolve conflicts. Then, commit and push your changes.", "Merge PR." (draft PRs: `gh pr create --draft -R <origin-owner/name>` using the workspace `github:` slug \u2014 never upstream). Never run git/gh from this orchestration cwd, and never merge the PR yourself.',
365
+ '- Or send_to_thread with those exact phrases: "Commit and push.", "Commit, push, and open a draft PR.", "Ready for review.", "Merge the remote branch (main) into your branch and resolve conflicts. Then, commit and push your changes.", "Merge PR." (draft PRs: `gh pr create --draft -R <origin-owner/name>` using the workspace `github:` slug \u2014 never upstream). Never run git/gh from this orchestration cwd, and never merge the PR yourself.',
366
366
  "Process guides:",
367
367
  "- Long child jobs (pack, test, deploy, anything that may run more than ~30s): workers always have `/long-running` (Sideboard product skill). Tell them to detach and wait; they may `stop_job` if it hangs or is doing the wrong thing; do not ask the human to poll.",
368
368
  "- Recurring multi-item / fan-out: if the child worktree has `.claude/skills/graph-engineering/SKILL.md`, tell the worker to follow it (`/graph-engineering`). Judge first; state on disk; grow the rulebook; do not patch three threads.",
@@ -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 can deadlock on shared ~/.codex locks. Omit agent; Sideboard applies Account defaults, and switches that nested-Codex case to Cursor only when a CURSOR_API_KEY is configured.",
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.",
@@ -6,7 +6,7 @@ import {
6
6
  loadBrightsyConfig,
7
7
  refreshBrightsyAccessToken,
8
8
  saveBrightsyConfig
9
- } from "./chunk-S42XV45P.js";
9
+ } from "./chunk-Y4MIXGPA.js";
10
10
  import {
11
11
  run
12
12
  } from "./chunk-FNQNJOHY.js";