@sideboard-ai/core 0.1.326 → 0.1.328

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 (73) hide show
  1. package/dist/{abletime-RYYFGKMU.js → abletime-NW4PJGHN.js} +4 -5
  2. package/dist/{abletime-RDHYSZL2.js → abletime-OW7LTFQD.js} +4 -5
  3. package/dist/{abletime-oauth-OYGS2DAU.js → abletime-oauth-KWQQRHOQ.js} +3 -4
  4. package/dist/{abletime-oauth-QR2QDVMK.js → abletime-oauth-TPR2QDRI.js} +3 -4
  5. package/dist/{abletime-rest-QDPTWNS4.js → abletime-rest-5DCWN3P4.js} +3 -4
  6. package/dist/{abletime-rest-BKYKNPTC.js → abletime-rest-UJ6SXDBN.js} +3 -4
  7. package/dist/agents/claude-runner.cjs +11 -0
  8. package/dist/agents/claude-runner.js +7 -1
  9. package/dist/{agents-QO7GKBYT.js → agents-IYBY3JT5.js} +8 -9
  10. package/dist/{agents-HANWZNI6.js → agents-XWIPONJR.js} +8 -9
  11. package/dist/{app-settings-RXBH7KY4.js → app-settings-A5D364JD.js} +1 -2
  12. package/dist/{app-settings-TUVLZNDE.js → app-settings-SA4HX3ZQ.js} +1 -2
  13. package/dist/{chunk-3Q4XNYHY.js → chunk-2GEUFPQQ.js} +1 -1
  14. package/dist/{chunk-MAW7DIG7.js → chunk-4F7THWIO.js} +2 -2
  15. package/dist/{chunk-K7M7MIWL.js → chunk-4G3W23X3.js} +3 -3
  16. package/dist/{chunk-Q3FHTGIW.js → chunk-5Y2C7Q55.js} +441 -20
  17. package/dist/{chunk-TMCK5TLA.js → chunk-ATQLP22S.js} +1 -1
  18. package/dist/{chunk-PB6HW7SA.js → chunk-CHYUUETG.js} +3 -3
  19. package/dist/{chunk-QPSKQP6E.js → chunk-D446IWPP.js} +48 -3
  20. package/dist/{chunk-C7HUCBX7.js → chunk-DACWFN4O.js} +5 -5
  21. package/dist/{chunk-B244TJWC.js → chunk-ECY7WL6T.js} +2 -2
  22. package/dist/{chunk-D744HOI5.js → chunk-EJRCHCXM.js} +18 -3
  23. package/dist/{chunk-KXRF6RNL.js → chunk-EUIVQAPK.js} +2 -2
  24. package/dist/{chunk-XLVLMQKN.js → chunk-EYDLXVED.js} +40 -25
  25. package/dist/{chunk-75RPUXJS.js → chunk-JKHCADKB.js} +5 -5
  26. package/dist/{chunk-4H5MWZ6J.js → chunk-KLVW3J2B.js} +2 -2
  27. package/dist/{chunk-QG4CYRA3.js → chunk-MO46K6WK.js} +14 -14
  28. package/dist/{chunk-F2PVRF3B.js → chunk-N6ZF3XRP.js} +2 -1
  29. package/dist/chunk-NJV5YEKI.js +194 -0
  30. package/dist/{chunk-BBNWKL4I.js → chunk-NQGLDQYB.js} +8 -8
  31. package/dist/{chunk-YGVGXQA7.js → chunk-Q4UPRQOS.js} +12 -12
  32. package/dist/{chunk-ZUAYA57W.js → chunk-QMLDR63X.js} +2 -2
  33. package/dist/{chunk-KECHK3ZT.js → chunk-R2C45NHT.js} +2 -2
  34. package/dist/{chunk-FWVUGLBG.js → chunk-RDXODLEN.js} +4 -4
  35. package/dist/{chunk-JM2TGOHP.js → chunk-SB5ADEZZ.js} +5 -5
  36. package/dist/{chunk-SO7G6O24.js → chunk-SFXGD5KJ.js} +1 -1
  37. package/dist/{chunk-LRHUBGEM.js → chunk-TUH4ICHQ.js} +1 -1
  38. package/dist/{chunk-WUCAVIIP.js → chunk-UMXBH344.js} +1 -1
  39. package/dist/{chunk-GP3RLZ6A.js → chunk-WD222BVP.js} +109 -491
  40. package/dist/{chunk-46FECFZU.js → chunk-X3XTO45Y.js} +39 -196
  41. package/dist/{chunk-RZVOX2MT.js → chunk-XBBZZHJY.js} +3 -3
  42. package/dist/{chunk-2EOLWHXH.js → chunk-XOMVOBPU.js} +127 -477
  43. package/dist/{chunk-ZSHS46V5.js → chunk-Y6OHM672.js} +476 -20
  44. package/dist/{chunk-YWQF7WAG.js → chunk-ZPBOWO64.js} +2 -2
  45. package/dist/{conductor-4GVTHUUB.js → conductor-G6GH5ZMU.js} +7 -7
  46. package/dist/{conductor-TGWI6ETZ.js → conductor-U5LGJZUJ.js} +6 -7
  47. package/dist/{coordinator-prompt-3E6SIDTM.js → coordinator-prompt-3PJLU3UH.js} +5 -6
  48. package/dist/{coordinator-prompt-WEYJREV6.js → coordinator-prompt-J7O7JB26.js} +5 -6
  49. package/dist/{global-workspace-UIEXAG2B.js → global-workspace-4CTLU2BV.js} +5 -6
  50. package/dist/{global-workspace-FPDZKUPF.js → global-workspace-Y3UDZYJX.js} +5 -6
  51. package/dist/index.cjs +605 -508
  52. package/dist/index.d.cts +23 -11
  53. package/dist/index.d.ts +23 -11
  54. package/dist/index.js +67 -65
  55. package/dist/{linear-6S7MK5YK.js → linear-CXWGH2TW.js} +2 -3
  56. package/dist/{linear-Z2T4KUAQ.js → linear-WLDCJ3AF.js} +2 -3
  57. package/dist/{linear-list-Q4M7AZO2.js → linear-list-52LEDEWO.js} +1 -1
  58. package/dist/{linear-list-A37WLUBO.js → linear-list-FGVN65JU.js} +1 -1
  59. package/dist/mcp/run-stdio.cjs +19762 -19682
  60. package/dist/mcp/run-stdio.js +33 -34
  61. package/dist/{optional-cli-CA4LL322.js → optional-cli-FN4MGB6W.js} +4 -5
  62. package/dist/{optional-cli-AANBL4U5.js → optional-cli-INRVBBBG.js} +3 -4
  63. package/dist/{orchestrator-RQXRZW7Z.js → orchestrator-3F53AZEN.js} +11 -12
  64. package/dist/{orchestrator-7FVDBE7Y.js → orchestrator-YY2JUYKD.js} +12 -12
  65. package/dist/{thread-store-4ZN3DS2W.js → thread-store-4WE24XA2.js} +6 -2
  66. package/dist/{thread-store-IC4BQXDW.js → thread-store-K2ZNGUSM.js} +7 -3
  67. package/dist/{workspaces-LEW4UP56.js → workspaces-MM7CQYR6.js} +5 -6
  68. package/dist/{workspaces-QONNLHNR.js → workspaces-WYCVZ6XH.js} +5 -6
  69. package/dist/{worktree-KFEJAQ2H.js → worktree-JBNEMJ5Z.js} +7 -8
  70. package/dist/{worktree-6GIONDQO.js → worktree-NNVRGPP4.js} +4 -5
  71. package/package.json +1 -1
  72. package/dist/chunk-77WWLBCI.js +0 -50
  73. package/dist/chunk-KGZBYWZ3.js +0 -23
@@ -8,11 +8,11 @@ import {
8
8
  isGlobalThread,
9
9
  isOrchestratorThread,
10
10
  isSlackCoordinatorThread
11
- } from "./chunk-FWVUGLBG.js";
11
+ } from "./chunk-RDXODLEN.js";
12
12
  import {
13
13
  mergeAgentGitAuthEnv,
14
14
  resolveAgentGitAuthEnv
15
- } from "./chunk-KECHK3ZT.js";
15
+ } from "./chunk-R2C45NHT.js";
16
16
  import {
17
17
  REVIEW_TAB_TITLE,
18
18
  allocateTeamName,
@@ -24,10 +24,15 @@ import {
24
24
  updateThread,
25
25
  worktreeNameFromPath,
26
26
  writeThread
27
- } from "./chunk-ZSHS46V5.js";
27
+ } from "./chunk-Y6OHM672.js";
28
28
  import {
29
29
  ensureWorktreeSideboardIgnored
30
30
  } from "./chunk-QKHEVSB5.js";
31
+ import {
32
+ extractPendingPlanQuestions,
33
+ isAskUserToolName,
34
+ lastTopLevelToolIsAskUser
35
+ } from "./chunk-NJV5YEKI.js";
31
36
  import {
32
37
  clipToolResultForStore
33
38
  } from "./chunk-OPXEJJBM.js";
@@ -44,7 +49,7 @@ import {
44
49
  import {
45
50
  assertOrchestratorCapableAgent,
46
51
  contextTokens
47
- } from "./chunk-QPSKQP6E.js";
52
+ } from "./chunk-D446IWPP.js";
48
53
  import {
49
54
  stripNestedElectronEnv
50
55
  } from "./chunk-4TR3HZFT.js";
@@ -1212,185 +1217,6 @@ function jobTreeAlive(pid) {
1212
1217
  return jobAlive(pid) || processGroupAlive(pid);
1213
1218
  }
1214
1219
 
1215
- // src/plan/ask-user.ts
1216
- function planQuestionsSignature(questions) {
1217
- return questions.map((q) => {
1218
- const opts = q.options.map((o) => o.label).join("");
1219
- return `${q.question}${opts}`;
1220
- }).join("");
1221
- }
1222
- function asRecord(v) {
1223
- return v != null && typeof v === "object" && !Array.isArray(v) ? v : null;
1224
- }
1225
- function parseOptions(raw) {
1226
- if (!Array.isArray(raw)) return [];
1227
- const out = [];
1228
- for (const item of raw) {
1229
- if (typeof item === "string" && item.trim()) {
1230
- out.push({ label: item.trim() });
1231
- continue;
1232
- }
1233
- const o = asRecord(item);
1234
- if (!o) continue;
1235
- const label = typeof o.label === "string" ? o.label.trim() : typeof o.text === "string" ? o.text.trim() : typeof o.title === "string" ? o.title.trim() : "";
1236
- if (!label) continue;
1237
- const description = typeof o.description === "string" && o.description.trim() ? o.description.trim() : void 0;
1238
- out.push({ label, description });
1239
- }
1240
- return out;
1241
- }
1242
- function parseOneQuestion(raw) {
1243
- const o = asRecord(raw);
1244
- if (!o) return null;
1245
- const question = typeof o.question === "string" ? o.question.trim() : typeof o.text === "string" ? o.text.trim() : typeof o.prompt === "string" ? o.prompt.trim() : "";
1246
- if (!question) return null;
1247
- const options = parseOptions(o.options);
1248
- if (options.length < 1) return null;
1249
- const header = typeof o.header === "string" && o.header.trim() ? o.header.trim() : void 0;
1250
- const multiSelect = Boolean(o.multiSelect ?? o.multi_select);
1251
- return { question, header, multiSelect, options };
1252
- }
1253
- function parsePlanQuestionsInput(input) {
1254
- const root = asRecord(input);
1255
- if (!root) return [];
1256
- const list = Array.isArray(root.questions) ? root.questions : Array.isArray(root.question) ? root.question : root.question || root.prompt ? [root] : [];
1257
- const out = [];
1258
- for (const item of list) {
1259
- const q = parseOneQuestion(item);
1260
- if (q) out.push(q);
1261
- }
1262
- return out;
1263
- }
1264
- var ASK_USER_TOOL_RE = /^(AskUserQuestion|ask_user|mcp__sideboard__ask_user)$/i;
1265
- function isAskUserToolName(name) {
1266
- if (!name) return false;
1267
- const base = name.replace(/^mcp__sideboard__/i, "");
1268
- return ASK_USER_TOOL_RE.test(name) || /^ask_user$/i.test(base);
1269
- }
1270
- function lastTopLevelToolIsAskUser(parts) {
1271
- if (!parts?.length) return false;
1272
- for (let i = parts.length - 1; i >= 0; i--) {
1273
- const part = parts[i];
1274
- if (part.type === "tool" && !part.parentId) {
1275
- return isAskUserToolName(part.name);
1276
- }
1277
- }
1278
- return false;
1279
- }
1280
- function hasTopLevelTool(parts) {
1281
- return Boolean(parts?.some((part) => part.type === "tool" && !part.parentId));
1282
- }
1283
- function questionsFromToolPart(part) {
1284
- const fromInput = parsePlanQuestionsInput(part.input);
1285
- if (fromInput.length) return fromInput;
1286
- const raw = part.result?.trim();
1287
- if (!raw || !raw.startsWith("{")) return [];
1288
- try {
1289
- return parsePlanQuestionsInput(JSON.parse(raw));
1290
- } catch {
1291
- return [];
1292
- }
1293
- }
1294
- function extractPendingPlanQuestions(parts) {
1295
- if (!parts?.length) return null;
1296
- for (let i = parts.length - 1; i >= 0; i--) {
1297
- const p = parts[i];
1298
- if (p.type !== "tool" || !isAskUserToolName(p.name)) continue;
1299
- const questions = questionsFromToolPart(p);
1300
- if (!questions.length) continue;
1301
- return {
1302
- id: p.id || `ask-${i}`,
1303
- signature: planQuestionsSignature(questions),
1304
- questions,
1305
- source: p.name || "ask_user"
1306
- };
1307
- }
1308
- return null;
1309
- }
1310
- function pendingFromAskBlock(block, dismissedQuestionSignature) {
1311
- if (!block || block.source !== "ask_user" || !block.questions?.length) return null;
1312
- const dismissed = dismissedQuestionSignature?.trim();
1313
- if (dismissed && (!block.questionSignature || block.questionSignature === dismissed)) {
1314
- return null;
1315
- }
1316
- const signature = block.questionSignature?.trim() || planQuestionsSignature(block.questions);
1317
- return {
1318
- id: `ask-block:${signature}`,
1319
- signature,
1320
- questions: block.questions,
1321
- source: "ask_user"
1322
- };
1323
- }
1324
- function askBlockStillWaiting(block, messages) {
1325
- if (!messages?.length) return Boolean(block?.at);
1326
- const askedAt = block?.at;
1327
- if (!askedAt) return false;
1328
- for (let i = messages.length - 1; i >= 0; i--) {
1329
- const message = messages[i];
1330
- if (message.role !== "user" || message.origin === "continue") continue;
1331
- if (!message.ts) return true;
1332
- return askedAt > message.ts;
1333
- }
1334
- return true;
1335
- }
1336
- function latestPendingPlanQuestions(input) {
1337
- if (input.userReplied) return null;
1338
- const fromBlock = () => pendingFromAskBlock(input.agentBlock, input.dismissedQuestionSignature);
1339
- if (lastTopLevelToolIsAskUser(input.liveParts)) {
1340
- return extractPendingPlanQuestions(input.liveParts) ?? fromBlock();
1341
- }
1342
- const last = input.messages[input.messages.length - 1];
1343
- if (last?.role === "agent" && lastTopLevelToolIsAskUser(last.parts)) {
1344
- return extractPendingPlanQuestions(last.parts) ?? fromBlock();
1345
- }
1346
- if (hasTopLevelTool(input.liveParts) || last?.role === "agent" && hasTopLevelTool(last.parts)) {
1347
- return null;
1348
- }
1349
- if (input.status === "running" || input.status === "queued") return null;
1350
- const stamped = fromBlock();
1351
- if (stamped && askBlockStillWaiting(input.agentBlock, input.messages)) {
1352
- return stamped;
1353
- }
1354
- return null;
1355
- }
1356
- var PLAN_QUESTION_ANSWERS_PREFIX = "Answers to your questions:";
1357
- function isPlanQuestionAnswersMessage(text) {
1358
- return text.startsWith(PLAN_QUESTION_ANSWERS_PREFIX);
1359
- }
1360
- function formatPlanQuestionAnswers(questions, answers) {
1361
- const lines = [PLAN_QUESTION_ANSWERS_PREFIX, ""];
1362
- for (let i = 0; i < questions.length; i++) {
1363
- const q = questions[i];
1364
- const a = answers.find((x) => x.questionIndex === i);
1365
- const header = q.header ? `**${q.header}** \u2014 ` : "";
1366
- const parts = [];
1367
- if (a?.selected.length) parts.push(a.selected.join(", "));
1368
- if (a?.other?.trim()) parts.push(a.other.trim());
1369
- const body = parts.length ? parts.join(" \xB7 ") : "(no answer)";
1370
- lines.push(`${i + 1}. ${header}${q.question} `);
1371
- lines.push(` \u2192 ${body}`);
1372
- }
1373
- return lines.join("\n");
1374
- }
1375
- function formatPlanQuestionsForChat(questions) {
1376
- const lines = ["### Questions for you", ""];
1377
- for (let i = 0; i < questions.length; i++) {
1378
- const q = questions[i];
1379
- const header = q.header ? `**${q.header}** \u2014 ` : "";
1380
- lines.push(`${i + 1}. ${header}${q.question}`);
1381
- for (let oi = 0; oi < q.options.length; oi++) {
1382
- const opt = q.options[oi];
1383
- const desc = opt.description?.trim();
1384
- lines.push(
1385
- desc ? ` - **${opt.label}** \u2014 ${desc}` : ` - **${opt.label}**`
1386
- );
1387
- }
1388
- lines.push("");
1389
- }
1390
- lines.push("_Answer in the composer below._");
1391
- return lines.join("\n").trimEnd();
1392
- }
1393
-
1394
1220
  // src/orchestrator/task-state.ts
1395
1221
  function isTerminalTaskState(state) {
1396
1222
  return state !== "submitted" && state !== "working";
@@ -1404,6 +1230,33 @@ function needsCoordinatorAction(state) {
1404
1230
  function endedOnAskUser(parts) {
1405
1231
  return lastTopLevelToolIsAskUser(parts);
1406
1232
  }
1233
+ function turnWaitingOnAskUser(parts, dismissedQuestionSignature) {
1234
+ if (!parts?.length) return false;
1235
+ let ask = null;
1236
+ for (let i = parts.length - 1; i >= 0; i--) {
1237
+ const part = parts[i];
1238
+ if (part.type === "tool" && !part.parentId && isAskUserToolName(part.name)) {
1239
+ ask = part;
1240
+ break;
1241
+ }
1242
+ }
1243
+ if (!ask) return false;
1244
+ const dismissed = dismissedQuestionSignature?.trim();
1245
+ if (!dismissed) return true;
1246
+ const pending = extractPendingPlanQuestions([ask]);
1247
+ if (!pending?.signature) return false;
1248
+ return pending.signature !== dismissed;
1249
+ }
1250
+ function userRepliedAfterAgent(messages, lastAgent) {
1251
+ if (!messages || !lastAgent) return false;
1252
+ const index = messages.lastIndexOf(lastAgent);
1253
+ if (index < 0) return false;
1254
+ for (let i = index + 1; i < messages.length; i++) {
1255
+ const message = messages[i];
1256
+ if (message.role === "user" && message.origin !== "continue") return true;
1257
+ }
1258
+ return false;
1259
+ }
1407
1260
  function deriveTaskState(input) {
1408
1261
  if (input.stillRunning) {
1409
1262
  return input.status === "queued" ? "submitted" : "working";
@@ -1415,7 +1268,7 @@ function deriveTaskState(input) {
1415
1268
  case "stopped":
1416
1269
  return "canceled";
1417
1270
  default:
1418
- return endedOnAskUser(input.lastAgentParts) ? "input-required" : "completed";
1271
+ return !input.userAnswered && turnWaitingOnAskUser(input.lastAgentParts, input.dismissedQuestionSignature) ? "input-required" : "completed";
1419
1272
  }
1420
1273
  }
1421
1274
 
@@ -1811,7 +1664,7 @@ var PORT_RANGE_SIZE = 10;
1811
1664
  var RECLAIM_RETRY_DELAY_MS = 40;
1812
1665
  var RECLAIM_TRIES = 8;
1813
1666
  async function killReclaimable(ports, worktreePath, signal) {
1814
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-4GVTHUUB.js");
1667
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-G6GH5ZMU.js");
1815
1668
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1816
1669
  else killListenersOnPorts2(ports);
1817
1670
  }
@@ -2492,21 +2345,11 @@ async function startDevServer(repoPath, worktreePath, onLine, opts) {
2492
2345
  }
2493
2346
 
2494
2347
  export {
2495
- planQuestionsSignature,
2496
- parsePlanQuestionsInput,
2497
- isAskUserToolName,
2498
- lastTopLevelToolIsAskUser,
2499
- extractPendingPlanQuestions,
2500
- askBlockStillWaiting,
2501
- latestPendingPlanQuestions,
2502
- PLAN_QUESTION_ANSWERS_PREFIX,
2503
- isPlanQuestionAnswersMessage,
2504
- formatPlanQuestionAnswers,
2505
- formatPlanQuestionsForChat,
2506
2348
  isTerminalTaskState,
2507
2349
  isIncompleteTaskState,
2508
2350
  needsCoordinatorAction,
2509
2351
  endedOnAskUser,
2352
+ userRepliedAfterAgent,
2510
2353
  deriveTaskState,
2511
2354
  mcpWaitForTurnTimeoutMs,
2512
2355
  mcpWaitTaskHint,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_ABLETIME_HOST,
3
3
  normalizeAbleTimeHost
4
- } from "./chunk-C7HUCBX7.js";
4
+ } from "./chunk-DACWFN4O.js";
5
5
  import {
6
6
  httpFetch
7
7
  } from "./chunk-JAT3JFOS.js";
@@ -10,7 +10,7 @@ import {
10
10
  getAbleTimeHost,
11
11
  loadAppSettings,
12
12
  saveAbleTimeConnection
13
- } from "./chunk-QPSKQP6E.js";
13
+ } from "./chunk-D446IWPP.js";
14
14
 
15
15
  // src/integrations/abletime-oauth.ts
16
16
  import { createHash, randomBytes } from "crypto";
@@ -280,7 +280,7 @@ async function startAbleTimeOAuth(opts) {
280
280
  persistAbleTimeTokens(data, { host });
281
281
  const token = data.access_token.trim();
282
282
  try {
283
- const { getAbleTimeOrientation } = await import("./abletime-RDHYSZL2.js");
283
+ const { getAbleTimeOrientation } = await import("./abletime-OW7LTFQD.js");
284
284
  const orientation = await getAbleTimeOrientation({ token, host });
285
285
  return saveAbleTimeConnection({
286
286
  accessToken: token,