@sideboard-ai/core 0.1.205 → 0.1.207

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 (50) hide show
  1. package/dist/{abletime-TONBQP4O.js → abletime-I4IYZBKU.js} +4 -4
  2. package/dist/{abletime-S3UHQZVW.js → abletime-UWSSLXH3.js} +4 -4
  3. package/dist/{abletime-oauth-SD4SZY5U.js → abletime-oauth-C3BQXKW3.js} +5 -3
  4. package/dist/{abletime-oauth-AVCEO2DY.js → abletime-oauth-UZHPB3W2.js} +14 -4
  5. package/dist/{abletime-rest-J2OBB4VA.js → abletime-rest-5YPPEOKK.js} +3 -3
  6. package/dist/{abletime-rest-6ODSXV7G.js → abletime-rest-HYNYDYK3.js} +3 -3
  7. package/dist/agents/cursor-runner.js +1 -1
  8. package/dist/{agents-67K4BQFJ.js → agents-7MULGRPU.js} +5 -5
  9. package/dist/{agents-BVOJNHV6.js → agents-KCBCFMFW.js} +6 -6
  10. package/dist/{app-settings-YEPF46IJ.js → app-settings-GJ6KDYEF.js} +1 -1
  11. package/dist/{app-settings-LGHMNHSP.js → app-settings-R2KNCT37.js} +1 -1
  12. package/dist/{chunk-FO45DMJ5.js → chunk-2GPZ4BAU.js} +81 -34
  13. package/dist/{chunk-X743YN5Y.js → chunk-4EGK47WV.js} +1 -0
  14. package/dist/{chunk-ULZLWQBS.js → chunk-5UQTT4S7.js} +79 -32
  15. package/dist/{chunk-6Q7DFVDQ.js → chunk-6J4OQ6TF.js} +14 -4
  16. package/dist/{chunk-WVATAIF4.js → chunk-6KH4OBEW.js} +2 -2
  17. package/dist/{chunk-FO2NTJ7L.js → chunk-6YZLSZLK.js} +3 -3
  18. package/dist/{chunk-YOSTWSNC.js → chunk-A2BRWIEM.js} +18 -11
  19. package/dist/{chunk-DFUES6QU.js → chunk-ARR4OGLY.js} +1 -0
  20. package/dist/{chunk-INNLWYXW.js → chunk-DWGEBZ3C.js} +1 -0
  21. package/dist/{chunk-CYLDJWRK.js → chunk-F4LZUEIO.js} +37 -7
  22. package/dist/{chunk-KZ7PI7FE.js → chunk-JZHRZ3DR.js} +6 -1
  23. package/dist/{chunk-QUW5D62C.js → chunk-N4A4NWFO.js} +2 -2
  24. package/dist/{chunk-VIPA75ZA.js → chunk-PAQPT3JO.js} +3 -3
  25. package/dist/{chunk-5SMS6QTO.js → chunk-QOJB5PC7.js} +3 -3
  26. package/dist/{chunk-3K257PCS.js → chunk-TEDEVD4O.js} +37 -7
  27. package/dist/{chunk-QAVWH2RQ.js → chunk-W6X4GZJG.js} +3 -3
  28. package/dist/{chunk-SGUVAK66.js → chunk-WXWJ5MJ4.js} +5 -5
  29. package/dist/{chunk-W6VM36YO.js → chunk-X45BV4VX.js} +5 -5
  30. package/dist/{chunk-QFBBUFD4.js → chunk-Y4CF7LHH.js} +1 -0
  31. package/dist/{chunk-WF33LOP4.js → chunk-ZU7R35NY.js} +23 -11
  32. package/dist/{coordinator-prompt-WEPXXLLX.js → coordinator-prompt-6A3D7BV3.js} +4 -4
  33. package/dist/{coordinator-prompt-NPT555BO.js → coordinator-prompt-6NV2IHEX.js} +4 -4
  34. package/dist/{global-workspace-2I2T7FL5.js → global-workspace-I2X6UQMX.js} +4 -4
  35. package/dist/{global-workspace-NSILADOM.js → global-workspace-VS6HZF2I.js} +4 -4
  36. package/dist/index.cjs +125 -24
  37. package/dist/index.d.cts +16 -3
  38. package/dist/index.d.ts +16 -3
  39. package/dist/index.js +15 -13
  40. package/dist/mcp/run-stdio.cjs +123 -24
  41. package/dist/mcp/run-stdio.js +11 -11
  42. package/dist/{orchestrator-I7GFXLHF.js → orchestrator-7WF32ZXJ.js} +6 -6
  43. package/dist/{orchestrator-CMAVNELS.js → orchestrator-CXQY5YRG.js} +7 -7
  44. package/dist/{thread-store-ZGVWPVHP.js → thread-store-LS2T6RVH.js} +1 -1
  45. package/dist/{thread-store-2SS5V5CN.js → thread-store-XGYWXR2P.js} +1 -1
  46. package/dist/{workspaces-BOC6M7BW.js → workspaces-7PM7UGLG.js} +4 -4
  47. package/dist/{workspaces-RFGZBUAR.js → workspaces-CEU25ANO.js} +4 -4
  48. package/dist/{worktree-G3ZLM4DC.js → worktree-T6PCOIHZ.js} +3 -3
  49. package/dist/{worktree-WSUQMMK4.js → worktree-YD7Y6NRY.js} +3 -3
  50. package/package.json +1 -1
@@ -37,13 +37,14 @@ import {
37
37
  pushTurnStderr,
38
38
  resolveQuotaFallbackAgent,
39
39
  shouldFeedErrorBackToAgent,
40
+ shouldRetryCodexPluginIsolate,
40
41
  shouldRetryFailedAgentTurn,
41
42
  stripBrightsyNdjsonNoise,
42
43
  sumUsageList,
43
44
  summarizeTurnStderr,
44
45
  toolDescription,
45
46
  turnFailChatText
46
- } from "./chunk-WF33LOP4.js";
47
+ } from "./chunk-ZU7R35NY.js";
47
48
  import {
48
49
  SLACK_REPLY_FORMATTING,
49
50
  addWorkspace,
@@ -66,7 +67,7 @@ import {
66
67
  stageAbsolutePathsAsAttachments,
67
68
  stageBuffersAsAttachments,
68
69
  syncWorkspacesFromThreads
69
- } from "./chunk-5SMS6QTO.js";
70
+ } from "./chunk-QOJB5PC7.js";
70
71
  import {
71
72
  addPrStackLayer,
72
73
  allocateTeamName,
@@ -116,7 +117,7 @@ import {
116
117
  worktreeDisplayLabelForGroup,
117
118
  worktreeNameFromPath,
118
119
  worktreeSlugForTicket
119
- } from "./chunk-QUW5D62C.js";
120
+ } from "./chunk-N4A4NWFO.js";
120
121
  import {
121
122
  ATTACHMENTS_DIR,
122
123
  DETACHED_JOBS_DIR,
@@ -134,7 +135,7 @@ import {
134
135
  updateThread,
135
136
  withThreadLock,
136
137
  writeThread
137
- } from "./chunk-INNLWYXW.js";
138
+ } from "./chunk-DWGEBZ3C.js";
138
139
  import {
139
140
  ensureWorktreeSideboardIgnored
140
141
  } from "./chunk-SYFVUF2C.js";
@@ -170,7 +171,7 @@ import {
170
171
  updateAdvancedSettings,
171
172
  usageOnLimit,
172
173
  writeSecureJson
173
- } from "./chunk-X743YN5Y.js";
174
+ } from "./chunk-4EGK47WV.js";
174
175
  import {
175
176
  writePrivateFile
176
177
  } from "./chunk-NSTQ6QKD.js";
@@ -408,7 +409,7 @@ async function continueSourceThread(threadId, prompt) {
408
409
  await continueOnReply(threadId, prompt);
409
410
  return;
410
411
  }
411
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-I7GFXLHF.js");
412
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-7WF32ZXJ.js");
412
413
  await getOrchestrator2().send(threadId, prompt);
413
414
  } catch {
414
415
  }
@@ -801,9 +802,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
801
802
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
802
803
  );
803
804
  }
804
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-2I2T7FL5.js");
805
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-I2X6UQMX.js");
805
806
  if (isGlobalThread2(thread)) {
806
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-NPT555BO.js");
807
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-6NV2IHEX.js");
807
808
  ensureGlobalCoordinatorCwd2(
808
809
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
809
810
  );
@@ -1011,6 +1012,24 @@ var FIX_CI_RE = /^Fix CI: .+\.$/;
1011
1012
  function normalizePrState(state) {
1012
1013
  return (state ?? "").trim().toUpperCase();
1013
1014
  }
1015
+ function samePrIdentity(a, b) {
1016
+ const left = (a ?? "").trim().replace(/\/+$/, "");
1017
+ const right = (b ?? "").trim().replace(/\/+$/, "");
1018
+ if (!left || !right) return false;
1019
+ if (left === right) return true;
1020
+ const ln = left.match(/\/pull\/(\d+)/i)?.[1];
1021
+ const rn = right.match(/\/pull\/(\d+)/i)?.[1];
1022
+ return Boolean(ln && rn && ln === rn);
1023
+ }
1024
+ function shouldPersistFetchedPrMeta(opts) {
1025
+ const meta = opts.metaUrl?.trim() || "";
1026
+ if (!meta) return false;
1027
+ const head = opts.headPrUrl?.trim() || "";
1028
+ if (head) return samePrIdentity(meta, head);
1029
+ const live = opts.livePrUrl?.trim() || "";
1030
+ if (live) return samePrIdentity(meta, live);
1031
+ return true;
1032
+ }
1014
1033
  function sameLoginList(a, b) {
1015
1034
  const left = [...a ?? []].map((s) => s.trim().toLowerCase()).filter(Boolean).sort();
1016
1035
  const right = [...b ?? []].map((s) => s.trim().toLowerCase()).filter(Boolean).sort();
@@ -3629,7 +3648,7 @@ async function createThread(input, _onSetupLine) {
3629
3648
  });
3630
3649
  await requireAgent(resolved.agent);
3631
3650
  if (input.cowboy) {
3632
- const { cowboyModeEnabled } = await import("./app-settings-LGHMNHSP.js");
3651
+ const { cowboyModeEnabled } = await import("./app-settings-R2KNCT37.js");
3633
3652
  if (!cowboyModeEnabled()) {
3634
3653
  throw new Error(
3635
3654
  "Cowboy mode is off. Enable it in Settings \u2192 Advanced."
@@ -3687,7 +3706,7 @@ async function createThread(input, _onSetupLine) {
3687
3706
  let sourceIsFork = false;
3688
3707
  if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
3689
3708
  if (isAbleTimeConnected() && getIssueSource() === "abletime") {
3690
- const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-S3UHQZVW.js");
3709
+ const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-UWSSLXH3.js");
3691
3710
  const task = await ensureAbleTimeTask({
3692
3711
  title: title?.trim() || "Untitled work",
3693
3712
  description: input.prompt?.trim() || void 0
@@ -4223,7 +4242,7 @@ async function adoptThread(input) {
4223
4242
  messages: input.messages ?? []
4224
4243
  });
4225
4244
  writeThread(thread);
4226
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-RFGZBUAR.js");
4245
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-CEU25ANO.js");
4227
4246
  await ensureWorkspace2(repoPath);
4228
4247
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-N5X5I422.js");
4229
4248
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -6601,7 +6620,7 @@ function formatScheduledPrompt(name, prompt) {
6601
6620
  ${prompt}`;
6602
6621
  }
6603
6622
  async function defaultDeps() {
6604
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-I7GFXLHF.js");
6623
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-7WF32ZXJ.js");
6605
6624
  const orch = getOrchestrator2();
6606
6625
  return {
6607
6626
  findThread: (id) => findThreadByRef(id),
@@ -6871,7 +6890,7 @@ var Orchestrator = class {
6871
6890
  orphans: orphans.map((o) => ({ path: o.path, repoPath: o.repoPath }))
6872
6891
  });
6873
6892
  }
6874
- const { autoCleanupOrphansEnabled } = await import("./app-settings-LGHMNHSP.js");
6893
+ const { autoCleanupOrphansEnabled } = await import("./app-settings-R2KNCT37.js");
6875
6894
  if (autoCleanupOrphansEnabled() && shouldRunWorktreeCleanup() && orphans.length > 0) {
6876
6895
  await cleanupOrphanWorktrees({ repoPaths });
6877
6896
  }
@@ -7163,7 +7182,7 @@ var Orchestrator = class {
7163
7182
  }
7164
7183
  await setup;
7165
7184
  if (skipSetup) return;
7166
- const { autoRunAfterSetupEnabled } = await import("./app-settings-LGHMNHSP.js");
7185
+ const { autoRunAfterSetupEnabled } = await import("./app-settings-R2KNCT37.js");
7167
7186
  if (autoRunAfterSetupEnabled()) {
7168
7187
  try {
7169
7188
  await this.startDev(threadId);
@@ -7487,7 +7506,7 @@ var Orchestrator = class {
7487
7506
  }
7488
7507
  const isBrightsy = fresh.agent === "brightsy";
7489
7508
  const isOrchestration = isOrchestratorThread(fresh);
7490
- const { autoRenameBranchEnabled, getGithubGitAuthMode, gitBranchPrefixSetting } = await import("./app-settings-LGHMNHSP.js");
7509
+ const { autoRenameBranchEnabled, getGithubGitAuthMode, gitBranchPrefixSetting } = await import("./app-settings-R2KNCT37.js");
7491
7510
  const gitAuthMode = getGithubGitAuthMode();
7492
7511
  const worktreeDirective = isBrightsy || isOrchestration ? null : formatWorktreeDirective(fresh, {
7493
7512
  githubSlug: await resolveGithubRepoSlug(fresh.worktreePath).catch(
@@ -7571,7 +7590,12 @@ var Orchestrator = class {
7571
7590
  const stderrTail = [];
7572
7591
  const handle = await spawnAgentTurn(
7573
7592
  fresh,
7574
- { cachedPrefix, prompt: agentPrompt, systemPrompt: turnReminders },
7593
+ {
7594
+ cachedPrefix,
7595
+ prompt: agentPrompt,
7596
+ systemPrompt: turnReminders,
7597
+ isolateCodexPlugins: fresh.isolateCodexPlugins === true
7598
+ },
7575
7599
  (event) => {
7576
7600
  this.emit({ type: "turn_output", threadId, event });
7577
7601
  noteTurnLiveEvent(threadId, event);
@@ -7645,10 +7669,21 @@ var Orchestrator = class {
7645
7669
  }
7646
7670
  let lastStderr = summarizeTurnStderr(stderrTail);
7647
7671
  let detail = lastStderr || (exitCode !== 0 ? fallbackTurnFailDetail(assistantText) : "");
7648
- if (exitCode !== 0 && !assistantText && parts.length === 0 && !this.stoppedTurns.has(threadId) && shouldRetryFailedAgentTurn(detail, {
7672
+ const liveThread = this.requireThread(threadId);
7673
+ const isolateCodexPluginRetry = liveThread.agent === "codex" && shouldRetryCodexPluginIsolate(detail, {
7674
+ // Coordinators already pass toCodexUnattendedAppsArgs — a second
7675
+ // isolate exec keeps sessionId and burns the crash/OOM retry.
7676
+ alreadyIsolated: liveThread.isolateCodexPlugins === true || isOrchestratorThread(liveThread)
7677
+ });
7678
+ if (isolateCodexPluginRetry) {
7679
+ updateThread(threadId, { isolateCodexPlugins: true });
7680
+ }
7681
+ if (exitCode !== 0 && !assistantText && parts.length === 0 && !this.stoppedTurns.has(threadId) && (isolateCodexPluginRetry || shouldRetryFailedAgentTurn(detail, {
7649
7682
  hasSession: Boolean(this.requireThread(threadId).sessionId)
7650
- })) {
7651
- updateThread(threadId, { sessionId: null });
7683
+ }))) {
7684
+ if (!isolateCodexPluginRetry) {
7685
+ updateThread(threadId, { sessionId: null });
7686
+ }
7652
7687
  try {
7653
7688
  const gitDirs = await resolveGitDirsForLockRecovery(thread.worktreePath);
7654
7689
  const clearedLocks = clearStaleIndexLocks(gitDirs, 2e3);
@@ -7657,7 +7692,7 @@ var Orchestrator = class {
7657
7692
  }
7658
7693
  } catch {
7659
7694
  }
7660
- const retryNote = looksLikeInvalidAgentSession(detail) ? "Agent session missing \u2014 starting a fresh session" : looksLikeV8Oom(detail) ? "Agent ran out of memory \u2014 starting a fresh session" : "Agent runner crashed \u2014 restarting Node once";
7695
+ const retryNote = isolateCodexPluginRetry ? "Codex plugin/MCP failed \u2014 continuing without that vendor plugin (Settings \u2192 Connectors + HTTP API)" : looksLikeInvalidAgentSession(detail) ? "Agent session missing \u2014 starting a fresh session" : looksLikeV8Oom(detail) ? "Agent ran out of memory \u2014 starting a fresh session" : "Agent runner crashed \u2014 restarting Node once";
7661
7696
  pushTurnStderr(stderrTail, retryNote);
7662
7697
  this.emit({
7663
7698
  type: "turn_output",
@@ -7681,7 +7716,12 @@ var Orchestrator = class {
7681
7716
  ].filter(Boolean).join("\n\n---\n\n");
7682
7717
  const retryHandle = await spawnAgentTurn(
7683
7718
  retryThread,
7684
- { cachedPrefix: retryPrefix, prompt: agentPrompt, systemPrompt: turnReminders },
7719
+ {
7720
+ cachedPrefix: retryPrefix,
7721
+ prompt: agentPrompt,
7722
+ systemPrompt: turnReminders,
7723
+ isolateCodexPlugins: isolateCodexPluginRetry || retryThread.isolateCodexPlugins === true
7724
+ },
7685
7725
  (event) => {
7686
7726
  this.emit({ type: "turn_output", threadId, event });
7687
7727
  if (event.type === "session_id") {
@@ -8436,7 +8476,7 @@ var Orchestrator = class {
8436
8476
  } catch {
8437
8477
  headUrl = null;
8438
8478
  }
8439
- return { thread, selectors: connectedPrSelectors(thread, headUrl), cwd };
8479
+ return { thread, selectors: connectedPrSelectors(thread, headUrl), cwd, headUrl };
8440
8480
  }
8441
8481
  async getPrChecks(threadRef) {
8442
8482
  const { selectors, cwd } = await this.withPrSelector(threadRef);
@@ -8447,13 +8487,20 @@ var Orchestrator = class {
8447
8487
  return null;
8448
8488
  }
8449
8489
  async getPrMeta(threadRef) {
8450
- const { thread, selectors, cwd } = await this.withPrSelector(threadRef);
8490
+ const { thread, selectors, cwd, headUrl } = await this.withPrSelector(threadRef);
8451
8491
  for (const selector of selectors) {
8452
8492
  const meta = await getPrMeta(cwd, selector);
8453
- if (meta) {
8454
- await this.persistPrMetaAndMaybeArchive(thread, meta);
8455
- return meta;
8493
+ if (!meta) continue;
8494
+ const live = this.requireThread(thread.id);
8495
+ if (!shouldPersistFetchedPrMeta({
8496
+ metaUrl: meta.url,
8497
+ livePrUrl: live.prUrl,
8498
+ headPrUrl: headUrl
8499
+ })) {
8500
+ continue;
8456
8501
  }
8502
+ await this.persistPrMetaAndMaybeArchive(live, meta);
8503
+ return meta;
8457
8504
  }
8458
8505
  return null;
8459
8506
  }
@@ -8475,7 +8522,7 @@ var Orchestrator = class {
8475
8522
  if (!titled.userSetTitle && meta.title && titled.title !== meta.title) {
8476
8523
  updateThread(thread.id, { title: meta.title });
8477
8524
  }
8478
- const { autoArchiveOnMergeEnabled } = await import("./app-settings-LGHMNHSP.js");
8525
+ const { autoArchiveOnMergeEnabled } = await import("./app-settings-R2KNCT37.js");
8479
8526
  const latest = this.requireThread(thread.id);
8480
8527
  if (!shouldAutoArchiveOnPrMerge({
8481
8528
  previousPrState: prevState || null,
@@ -8752,7 +8799,7 @@ var Orchestrator = class {
8752
8799
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
8753
8800
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
8754
8801
  try {
8755
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-RFGZBUAR.js");
8802
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-CEU25ANO.js");
8756
8803
  await ensureWorkspace2(thread.repoPath);
8757
8804
  } catch {
8758
8805
  }
@@ -8779,7 +8826,7 @@ var Orchestrator = class {
8779
8826
  await runArchiveScript(thread.repoPath, thread.worktreePath);
8780
8827
  } catch {
8781
8828
  }
8782
- const { deleteBranchOnPurgeEnabled } = await import("./app-settings-LGHMNHSP.js");
8829
+ const { deleteBranchOnPurgeEnabled } = await import("./app-settings-R2KNCT37.js");
8783
8830
  const deleteBranch = opts?.deleteBranch ?? deleteBranchOnPurgeEnabled();
8784
8831
  await removeWorktree(thread.repoPath, thread.worktreePath, {
8785
8832
  deleteBranch: deleteBranch ? thread.branchName : void 0
@@ -8806,7 +8853,7 @@ var Orchestrator = class {
8806
8853
  `Cowboy checkout missing: ${thread.worktreePath}. Re-add the project folder, then restore.`
8807
8854
  );
8808
8855
  }
8809
- const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-WSUQMMK4.js");
8856
+ const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-YD7Y6NRY.js");
8810
8857
  const slug = thread.worktreePath.split("/").pop();
8811
8858
  const dest = thread.worktreePath;
8812
8859
  await withRepoGitLock(thread.repoPath, async () => {
@@ -8916,7 +8963,7 @@ async function startOrchestration(opts) {
8916
8963
  sourceRef: "default",
8917
8964
  ...createOpts
8918
8965
  }).catch(async () => {
8919
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-WSUQMMK4.js");
8966
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-YD7Y6NRY.js");
8920
8967
  const repo = await resolveRepoRoot2(repoPath);
8921
8968
  const def = await resolveDefaultBranch2(repo);
8922
8969
  return orch.createThread({
@@ -8926,7 +8973,7 @@ async function startOrchestration(opts) {
8926
8973
  repoPath: repo
8927
8974
  });
8928
8975
  });
8929
- const { updateThread: upd } = await import("./thread-store-ZGVWPVHP.js");
8976
+ const { updateThread: upd } = await import("./thread-store-LS2T6RVH.js");
8930
8977
  const updated = upd(thread.id, {
8931
8978
  sourceType: "orchestration",
8932
8979
  sourceRef: goal
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_ABLETIME_HOST,
3
3
  normalizeAbleTimeHost
4
- } from "./chunk-W6VM36YO.js";
4
+ } from "./chunk-X45BV4VX.js";
5
5
  import {
6
6
  httpFetch
7
7
  } from "./chunk-N7WZ6NIN.js";
@@ -10,7 +10,7 @@ import {
10
10
  getAbleTimeHost,
11
11
  loadAppSettings,
12
12
  saveAbleTimeConnection
13
- } from "./chunk-QFBBUFD4.js";
13
+ } from "./chunk-Y4CF7LHH.js";
14
14
 
15
15
  // src/integrations/abletime-oauth.ts
16
16
  import { createHash, randomBytes } from "crypto";
@@ -72,6 +72,12 @@ function ableTimeOAuthClientId() {
72
72
  function ableTimeOAuthResource(host) {
73
73
  return `${normalizeAbleTimeHost(host)}/api/public/v2/mcp`;
74
74
  }
75
+ function resolveAbleTimeOAuthHost(requested, saved) {
76
+ const fromRequest = requested?.trim();
77
+ if (fromRequest) return fromRequest;
78
+ const fromSaved = saved?.trim();
79
+ return fromSaved || void 0;
80
+ }
75
81
  function createAbleTimePkce() {
76
82
  const verifier = randomBytes(32).toString("base64url");
77
83
  const challenge = createHash("sha256").update(verifier).digest("base64url");
@@ -183,7 +189,10 @@ async function startAbleTimeOAuth(opts) {
183
189
  `AbleTime browser sign-in needs a Client ID Metadata Document URL. Host ${BAKED_ABLETIME_OAUTH_CLIENT_ID} (see site/oauth/abletime-client.json), or set SIDEBOARD_ABLETIME_OAUTH_CLIENT_ID.`
184
190
  );
185
191
  }
186
- const host = opts?.host?.trim() || void 0;
192
+ const host = resolveAbleTimeOAuthHost(
193
+ opts?.host,
194
+ loadAppSettings().integrations.abletimeHost
195
+ );
187
196
  const state = randomBytes(16).toString("hex");
188
197
  const pkce = createAbleTimePkce();
189
198
  const authorizeUrl = ableTimeOAuthAuthorizeUrl(clientId, state, pkce.challenge, host);
@@ -271,7 +280,7 @@ async function startAbleTimeOAuth(opts) {
271
280
  persistAbleTimeTokens(data, { host });
272
281
  const token = data.access_token.trim();
273
282
  try {
274
- const { getAbleTimeOrientation } = await import("./abletime-TONBQP4O.js");
283
+ const { getAbleTimeOrientation } = await import("./abletime-I4IYZBKU.js");
275
284
  const orientation = await getAbleTimeOrientation({ token, host });
276
285
  return saveAbleTimeConnection({
277
286
  accessToken: token,
@@ -299,6 +308,7 @@ export {
299
308
  hasBakedAbleTimeOAuth,
300
309
  ableTimeOAuthClientId,
301
310
  ableTimeOAuthResource,
311
+ resolveAbleTimeOAuthHost,
302
312
  createAbleTimePkce,
303
313
  ableTimeOAuthAuthorizeUrl,
304
314
  ensureAbleTimeAccessToken,
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  getGithubGitAuthMode,
9
9
  getGithubPat
10
- } from "./chunk-QFBBUFD4.js";
10
+ } from "./chunk-Y4CF7LHH.js";
11
11
  import {
12
12
  listThreads
13
- } from "./chunk-DFUES6QU.js";
13
+ } from "./chunk-ARR4OGLY.js";
14
14
  import {
15
15
  worktreesRoot
16
16
  } from "./chunk-WFUDY6PC.js";
@@ -2,17 +2,17 @@
2
2
 
3
3
  import {
4
4
  textFromAbleTimeDoc
5
- } from "./chunk-3K257PCS.js";
5
+ } from "./chunk-TEDEVD4O.js";
6
6
  import {
7
7
  assertAbleTimeCredential,
8
8
  callAbleTimeTool,
9
9
  normalizeAbleTimeHost,
10
10
  rewriteAbleTimeError
11
- } from "./chunk-SGUVAK66.js";
11
+ } from "./chunk-WXWJ5MJ4.js";
12
12
  import {
13
13
  isAbleTimeConnected,
14
14
  saveAbleTimeConnection
15
- } from "./chunk-X743YN5Y.js";
15
+ } from "./chunk-4EGK47WV.js";
16
16
 
17
17
  // src/integrations/abletime.ts
18
18
  var CLOSED_STATES = /* @__PURE__ */ new Set([
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  isOrchestratorThread
3
- } from "./chunk-VIPA75ZA.js";
3
+ } from "./chunk-PAQPT3JO.js";
4
4
  import {
5
5
  codexUnattendedGitConfigArgs,
6
6
  mergeAgentGitAuthEnv,
7
7
  resolveAgentGitAuthEnv,
8
8
  resolveCodexGitWritableRoots
9
- } from "./chunk-WVATAIF4.js";
9
+ } from "./chunk-6KH4OBEW.js";
10
10
  import {
11
11
  applyConnectedTeamToCli,
12
12
  brightsyMcpServerName,
@@ -33,7 +33,7 @@ import {
33
33
  packagedMcpStdioPath,
34
34
  parseCursorRunnerLine,
35
35
  resolveNodeLaunch
36
- } from "./chunk-KZ7PI7FE.js";
36
+ } from "./chunk-JZHRZ3DR.js";
37
37
  import {
38
38
  claudeChromeEnabled,
39
39
  isAbleTimeConnected,
@@ -41,7 +41,7 @@ import {
41
41
  loadAppSettings,
42
42
  resolveAgentExecutable,
43
43
  resolveClaudeExecutable
44
- } from "./chunk-QFBBUFD4.js";
44
+ } from "./chunk-Y4CF7LHH.js";
45
45
  import {
46
46
  isElectronLikeCommand,
47
47
  unwrapStrippedElectronLaunch
@@ -178,13 +178,18 @@ function normalizeTurnInput(input) {
178
178
  return {
179
179
  prompt: input.prompt,
180
180
  cachedPrefix: input.cachedPrefix?.trim() || void 0,
181
- systemPrompt: input.systemPrompt?.trim() || void 0
181
+ systemPrompt: input.systemPrompt?.trim() || void 0,
182
+ ...input.isolateCodexPlugins ? { isolateCodexPlugins: true } : {}
182
183
  };
183
184
  }
184
185
  function dropCachedPrefixOnResume(input, sessionId) {
185
186
  const turn = normalizeTurnInput(input);
186
187
  if (sessionId) {
187
- return turn.systemPrompt ? { prompt: turn.prompt, systemPrompt: turn.systemPrompt } : { prompt: turn.prompt };
188
+ return {
189
+ prompt: turn.prompt,
190
+ ...turn.systemPrompt ? { systemPrompt: turn.systemPrompt } : {},
191
+ ...turn.isolateCodexPlugins ? { isolateCodexPlugins: true } : {}
192
+ };
188
193
  }
189
194
  return turn;
190
195
  }
@@ -1937,7 +1942,7 @@ var claudeAdapter = {
1937
1942
  );
1938
1943
  }
1939
1944
  const mode = permissionMode(thread);
1940
- const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-NSILADOM.js");
1945
+ const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-VS6HZF2I.js");
1941
1946
  const isOrchestrator = isOrchestratorThread2(thread);
1942
1947
  const injectedServers = await buildInjectedMcpServers({
1943
1948
  includeSideboard: true,
@@ -2341,9 +2346,7 @@ function toCodexUnattendedAppsArgs() {
2341
2346
  "-c",
2342
2347
  "apps.posthog.enabled=false",
2343
2348
  "-c",
2344
- "features.plugins=false",
2345
- "-c",
2346
- "mcp_servers.posthog.enabled=false"
2349
+ "features.plugins=false"
2347
2350
  ];
2348
2351
  }
2349
2352
 
@@ -2512,8 +2515,12 @@ var codexAdapter = {
2512
2515
  }),
2513
2516
  orchestratorThreadId: isOrchestrator ? thread.id : null
2514
2517
  });
2518
+ const isolatePlugins = isOrchestrator || Boolean(thread.isolateCodexPlugins) || Boolean(normalizeTurnInput(input).isolateCodexPlugins);
2515
2519
  const mcpOverrides = [
2516
- ...toCodexUnattendedAppsArgs(),
2520
+ // Worktree first try keeps plugins (Claude connectors). Coordinators
2521
+ // isolate. After a fatal plugin MCP, the orchestrator retries with
2522
+ // isolateCodexPlugins so the turn continues. Never invent mcp_servers.posthog.
2523
+ ...isolatePlugins ? toCodexUnattendedAppsArgs() : [],
2517
2524
  ...toCodexMcpConfigArgs(injected),
2518
2525
  ...isOrchestrator ? toCodexDisableUserMcpArgs(
2519
2526
  userMcpNamesToDisable({
@@ -36,6 +36,7 @@ function normalizeThread(raw) {
36
36
  effort: resolveThreadEffort(raw),
37
37
  fast: Boolean(raw.fast),
38
38
  planMode: Boolean(raw.planMode),
39
+ isolateCodexPlugins: raw.isolateCodexPlugins === true ? true : void 0,
39
40
  autonomy: raw.autonomy ?? "default",
40
41
  lastError: raw.lastError ?? null,
41
42
  agentPid: raw.agentPid ?? null,
@@ -38,6 +38,7 @@ function normalizeThread(raw) {
38
38
  effort: resolveThreadEffort(raw),
39
39
  fast: Boolean(raw.fast),
40
40
  planMode: Boolean(raw.planMode),
41
+ isolateCodexPlugins: raw.isolateCodexPlugins === true ? true : void 0,
41
42
  autonomy: raw.autonomy ?? "default",
42
43
  lastError: raw.lastError ?? null,
43
44
  agentPid: raw.agentPid ?? null,
@@ -4,14 +4,14 @@ import {
4
4
  normalizeAbleTimeCredential,
5
5
  normalizeAbleTimeHost,
6
6
  rewriteAbleTimeError
7
- } from "./chunk-W6VM36YO.js";
7
+ } from "./chunk-X45BV4VX.js";
8
8
  import {
9
9
  httpFetch
10
10
  } from "./chunk-N7WZ6NIN.js";
11
11
  import {
12
12
  getAbleTimeAccessToken,
13
13
  getAbleTimeHost
14
- } from "./chunk-QFBBUFD4.js";
14
+ } from "./chunk-Y4CF7LHH.js";
15
15
 
16
16
  // src/integrations/abletime-rest.ts
17
17
  var ABLETIME_REST_PREFIX = "/api/public/v2";
@@ -153,6 +153,7 @@ function restTaskToRaw(raw, users) {
153
153
  description: textFromAbleTimeDoc(rec.description) || asString(rec.descriptionSanitized),
154
154
  projectId: asString(rec.projectId),
155
155
  categoryId: asString(rec.projectCategoryId) || asString(rec.categoryId),
156
+ parentId: asString(rec.parentTaskId) || asString(rec.parentId),
156
157
  tags: rec.tags,
157
158
  comments,
158
159
  createdAt: asString(rec.dateCreated) || asString(rec.createdAt),
@@ -243,6 +244,19 @@ function firstStringArg(args, keys) {
243
244
  }
244
245
  return "";
245
246
  }
247
+ function isNoneToken(value) {
248
+ return value.trim().toLowerCase() === "none";
249
+ }
250
+ function findRestProject(projects, projectId) {
251
+ const wanted = projectId.trim().toLowerCase();
252
+ return projects.find(
253
+ (item) => asString(item.id).toLowerCase() === wanted || asString(item.name).toLowerCase() === wanted
254
+ ) ?? null;
255
+ }
256
+ async function resolveRestParentTaskId(parent, opts) {
257
+ if (isNoneToken(parent)) return null;
258
+ return resolveTaskId(parent, opts);
259
+ }
246
260
  async function callAbleTimeRestTool(name, args = {}, opts) {
247
261
  const token = normalizeAbleTimeCredential(opts?.token ?? getAbleTimeAccessToken() ?? "");
248
262
  if (!token) {
@@ -288,9 +302,7 @@ async function callAbleTimeRestTool(name, args = {}, opts) {
288
302
  const projectId = firstStringArg(args, ["project_id", "projectId", "project"]);
289
303
  if (!projectId) throw new Error("AbleTime project is required");
290
304
  const projects = await listProjectsRaw(requestOpts);
291
- const project = projects.find(
292
- (item) => String(item.id).toLowerCase() === projectId.toLowerCase() || String(item.name).toLowerCase() === projectId.toLowerCase()
293
- ) ?? projects[0];
305
+ const project = findRestProject(projects, projectId) ?? projects[0];
294
306
  if (!project) throw new Error("AbleTime has no projects to create a task in");
295
307
  const categories = asList(project.categories);
296
308
  const wantedCategory = firstStringArg(args, ["category_id", "categoryId", "category"]);
@@ -298,13 +310,16 @@ async function callAbleTimeRestTool(name, args = {}, opts) {
298
310
  if (!item || !wantedCategory) return false;
299
311
  return asString(item.id).toLowerCase() === wantedCategory.toLowerCase() || asString(item.name).toLowerCase() === wantedCategory.toLowerCase();
300
312
  }) ?? asRecord(categories[0]);
313
+ const parentArg = firstStringArg(args, ["parent", "parent_id", "parentId", "related_task_id"]);
314
+ const parentTaskId = parentArg ? await resolveRestParentTaskId(parentArg, requestOpts) : void 0;
301
315
  const created = await abletimeRestRequest("/tasks", {
302
316
  ...requestOpts,
303
317
  method: "POST",
304
318
  body: {
305
- projectId: project.id,
319
+ projectId: asString(project.id),
306
320
  projectCategoryId: category ? asString(category.id) : void 0,
307
- title
321
+ title,
322
+ ...parentTaskId ? { parentTaskId } : {}
308
323
  }
309
324
  });
310
325
  const state = firstStringArg(args, ["state"]);
@@ -337,6 +352,21 @@ async function callAbleTimeRestTool(name, args = {}, opts) {
337
352
  if (args.tags !== void 0 || args.labels !== void 0) {
338
353
  patch.tags = args.tags ?? args.labels ?? args.tag_names;
339
354
  }
355
+ const projectArg = firstStringArg(args, ["project", "project_id", "projectId"]);
356
+ if (projectArg) {
357
+ if (isNoneToken(projectArg)) {
358
+ throw new Error("AbleTime tasks stay in a project \u2014 pass a project name or id");
359
+ }
360
+ const projects = await listProjectsRaw(requestOpts);
361
+ const project = findRestProject(projects, projectArg);
362
+ const nextProjectId = project ? asString(project.id) : "";
363
+ if (!nextProjectId) throw new Error(`AbleTime project not found: ${projectArg}`);
364
+ patch.projectId = nextProjectId;
365
+ }
366
+ const parentArg = firstStringArg(args, ["parent", "parent_id", "parentId", "related_task_id"]);
367
+ if (parentArg) {
368
+ patch.parentTaskId = await resolveRestParentTaskId(parentArg, requestOpts);
369
+ }
340
370
  if (Object.keys(patch).length > 0) {
341
371
  await abletimeRestRequest(`/tasks/${encodeURIComponent(id)}`, {
342
372
  ...requestOpts,
@@ -324,6 +324,10 @@ function turnFailChatText(opts) {
324
324
 
325
325
  ${fail}`;
326
326
  }
327
+ function shouldRetryCodexPluginIsolate(detail, opts) {
328
+ if (opts?.alreadyIsolated) return false;
329
+ return looksLikeCodexMcpError(detail);
330
+ }
327
331
  function looksLikeCodexMcpError(text) {
328
332
  const t = text.trim().toLowerCase();
329
333
  if (!t) return false;
@@ -336,7 +340,7 @@ function looksLikeCodexMcpError(text) {
336
340
  if (/\brmcp\b/.test(t) && /fatal|quit|transport|error|died|kill|auth/.test(t)) {
337
341
  return true;
338
342
  }
339
- return /mcp[_ -]?(server|tool|error|transport|client)/.test(t) && /fail|error|timeout|disconnect|auth|unauthorized/.test(t);
343
+ return /invalid transport in mcp_servers/.test(t);
340
344
  }
341
345
  function shouldFeedErrorBackToAgent(opts) {
342
346
  const detail = opts.detail.trim();
@@ -1134,6 +1138,7 @@ export {
1134
1138
  looksLikeAgentFailureMessage,
1135
1139
  fallbackTurnFailDetail,
1136
1140
  turnFailChatText,
1141
+ shouldRetryCodexPluginIsolate,
1137
1142
  shouldFeedErrorBackToAgent,
1138
1143
  formatAgentErrorContinuePrompt,
1139
1144
  formatTurnExitError,
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-D6JWYJ4P.js";
6
6
  import {
7
7
  listThreads
8
- } from "./chunk-INNLWYXW.js";
8
+ } from "./chunk-DWGEBZ3C.js";
9
9
  import {
10
10
  ensureWorktreeSideboardIgnored
11
11
  } from "./chunk-SYFVUF2C.js";
@@ -22,7 +22,7 @@ import {
22
22
  import {
23
23
  getGithubGitAuthMode,
24
24
  getGithubPat
25
- } from "./chunk-X743YN5Y.js";
25
+ } from "./chunk-4EGK47WV.js";
26
26
  import {
27
27
  worktreesRoot
28
28
  } from "./chunk-EQNRWDLN.js";
@@ -5,7 +5,7 @@ import {
5
5
  resolveRepoRoot,
6
6
  takenSlugsFromThread,
7
7
  teamSlugFromName
8
- } from "./chunk-WVATAIF4.js";
8
+ } from "./chunk-6KH4OBEW.js";
9
9
  import {
10
10
  ATTACHMENTS_DIR,
11
11
  attachmentsGitignoreBody
@@ -22,13 +22,13 @@ import {
22
22
  resolveThreadDefaults,
23
23
  resolveViewerProfile,
24
24
  resolveViewerProfileForRepo
25
- } from "./chunk-QFBBUFD4.js";
25
+ } from "./chunk-Y4CF7LHH.js";
26
26
  import {
27
27
  createEmptyThread,
28
28
  listThreads,
29
29
  updateThread,
30
30
  writeThread
31
- } from "./chunk-DFUES6QU.js";
31
+ } from "./chunk-ARR4OGLY.js";
32
32
  import {
33
33
  appDataDir,
34
34
  globalAgentCwd,