@sideboard-ai/core 0.1.313 → 0.1.315

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 (59) hide show
  1. package/dist/{abletime-SJUVZVRU.js → abletime-QK3KMRQD.js} +4 -4
  2. package/dist/{abletime-T5YSJLNZ.js → abletime-QQZWYJXC.js} +4 -4
  3. package/dist/{abletime-oauth-73TFJME4.js → abletime-oauth-CAHTMB4V.js} +3 -3
  4. package/dist/{abletime-oauth-2TOOZ2FN.js → abletime-oauth-I2RRPVKT.js} +3 -3
  5. package/dist/{abletime-rest-PNUGH2FS.js → abletime-rest-5V4KGMSY.js} +3 -3
  6. package/dist/{abletime-rest-5TDRIFEV.js → abletime-rest-W5TLQK7C.js} +3 -3
  7. package/dist/{agents-OHIE3Z7L.js → agents-5XJ7EHGU.js} +6 -6
  8. package/dist/{agents-PSNWJMEC.js → agents-Y3M3EKLY.js} +6 -6
  9. package/dist/{app-settings-CC65VPBL.js → app-settings-CZVFMOI5.js} +3 -1
  10. package/dist/{app-settings-DZ5AY7N5.js → app-settings-RQAFJZCD.js} +3 -1
  11. package/dist/{chunk-EGTCXNQM.js → chunk-53OCOGND.js} +2 -2
  12. package/dist/{chunk-DLGGLV2M.js → chunk-5CTG5W7S.js} +2 -2
  13. package/dist/{chunk-JARCAPKL.js → chunk-72OWKHFJ.js} +3 -3
  14. package/dist/{chunk-CW4FIIDE.js → chunk-7J2KOIYD.js} +3 -3
  15. package/dist/{chunk-U3J2YY4T.js → chunk-BMORGDYI.js} +48 -28
  16. package/dist/{chunk-BIPXOHZI.js → chunk-BPBDGJ43.js} +2 -2
  17. package/dist/{chunk-HG25AYBV.js → chunk-CHUPIJP7.js} +14 -0
  18. package/dist/{chunk-E2NJ6RH7.js → chunk-CYPFOIUK.js} +47 -27
  19. package/dist/{chunk-JWW66PO3.js → chunk-DV6ID6CK.js} +5 -5
  20. package/dist/{chunk-2JOBQUUS.js → chunk-FVTR54LY.js} +120 -56
  21. package/dist/{chunk-PHMFAU35.js → chunk-GCHSJCCX.js} +96 -64
  22. package/dist/{chunk-5QX2NYXL.js → chunk-GFM63DTU.js} +12 -9
  23. package/dist/{chunk-QC2TQMPJ.js → chunk-IODJCVMN.js} +5 -5
  24. package/dist/{chunk-CFTOKVQN.js → chunk-JRZTJ4F7.js} +5 -5
  25. package/dist/{chunk-62ESCTJ4.js → chunk-MBYGWNLQ.js} +3 -3
  26. package/dist/{chunk-OLSLE3LO.js → chunk-MKGSMPWB.js} +3 -3
  27. package/dist/{chunk-TDXORDN6.js → chunk-NKVNHBDB.js} +119 -55
  28. package/dist/{chunk-U4WACWBC.js → chunk-NXNNYY3Q.js} +2 -2
  29. package/dist/{chunk-SZ3XS2WM.js → chunk-NZVD5EVX.js} +2 -2
  30. package/dist/{chunk-WRZRX4Q7.js → chunk-OLYNM52B.js} +4 -4
  31. package/dist/{chunk-X3FSWWW2.js → chunk-PN32Z4JL.js} +12 -9
  32. package/dist/{chunk-RU6DTCCV.js → chunk-S3U4HR5F.js} +2 -2
  33. package/dist/{chunk-3UDRWMIM.js → chunk-U35AHE2P.js} +14 -0
  34. package/dist/{chunk-A2YXQC65.js → chunk-U7PNCYNX.js} +96 -64
  35. package/dist/{chunk-6424BACS.js → chunk-Y4WARKPW.js} +2 -2
  36. package/dist/{chunk-ZW7RSQHY.js → chunk-YR7NZYUT.js} +5 -5
  37. package/dist/{conductor-YOBSYPLT.js → conductor-DKWTQADV.js} +5 -5
  38. package/dist/{conductor-CTWR6NH4.js → conductor-IMKNYQWZ.js} +5 -5
  39. package/dist/{coordinator-prompt-GZCWQAAV.js → coordinator-prompt-HUZC4DZ2.js} +4 -4
  40. package/dist/{coordinator-prompt-YAZRQ4BI.js → coordinator-prompt-SPOYUZG5.js} +4 -4
  41. package/dist/{global-workspace-BZAVBOH3.js → global-workspace-3NNDDTFD.js} +4 -4
  42. package/dist/{global-workspace-H6X32IJZ.js → global-workspace-SK4JQBPN.js} +4 -4
  43. package/dist/index.cjs +285 -123
  44. package/dist/index.d.cts +84 -59
  45. package/dist/index.d.ts +84 -59
  46. package/dist/index.js +25 -21
  47. package/dist/mcp/run-stdio.cjs +280 -121
  48. package/dist/mcp/run-stdio.js +15 -14
  49. package/dist/{optional-cli-QDIT57VD.js → optional-cli-EMSZBYDE.js} +3 -3
  50. package/dist/{optional-cli-QY6V5S5N.js → optional-cli-LMSRZNH4.js} +4 -4
  51. package/dist/{orchestrator-BF7TKSA2.js → orchestrator-4XFRK57E.js} +9 -9
  52. package/dist/{orchestrator-RRHB7RNN.js → orchestrator-ZRMZ4TCL.js} +9 -9
  53. package/dist/{thread-store-HY22M5A7.js → thread-store-5OF6M6VZ.js} +1 -1
  54. package/dist/{thread-store-XMUQDO5O.js → thread-store-GOVVXQV2.js} +1 -1
  55. package/dist/{workspaces-BQUDYTBX.js → workspaces-52L6NZ3P.js} +4 -4
  56. package/dist/{workspaces-AGOLRBYZ.js → workspaces-EYNZDL45.js} +4 -4
  57. package/dist/{worktree-C5VI46RZ.js → worktree-BP5ICYQ2.js} +3 -3
  58. package/dist/{worktree-FMK57ULT.js → worktree-UCOSAI7J.js} +3 -3
  59. package/package.json +1 -1
@@ -55,6 +55,73 @@ function coerceOrchestratorAgent(agent, fallback = "claude") {
55
55
  return isOrchestratorCapableAgent(agent) ? agent : fallback;
56
56
  }
57
57
 
58
+ // src/store/thread-option-defaults.ts
59
+ function normalizeAutonomy(value) {
60
+ return value === "default" || value === "full" ? value : void 0;
61
+ }
62
+ function getDefaultAgent(settings = loadAppSettings()) {
63
+ return settings.defaults.agent ?? "claude";
64
+ }
65
+ function getDefaultModel(settings = loadAppSettings()) {
66
+ const model = settings.defaults.model?.trim();
67
+ return model || null;
68
+ }
69
+ function getDefaultEffort(settings = loadAppSettings()) {
70
+ return normalizeThinkingEffort(settings.defaults.effort) ?? "high";
71
+ }
72
+ function getDefaultFast(settings = loadAppSettings()) {
73
+ return settings.defaults.fast === true;
74
+ }
75
+ function getDefaultAutonomy(settings = loadAppSettings()) {
76
+ return settings.defaults.autonomy === "default" ? "default" : "full";
77
+ }
78
+ function resolveThreadDefaults(settings = loadAppSettings()) {
79
+ return {
80
+ agent: getDefaultAgent(settings),
81
+ model: getDefaultModel(settings),
82
+ effort: getDefaultEffort(settings),
83
+ fast: getDefaultFast(settings),
84
+ autonomy: getDefaultAutonomy(settings)
85
+ };
86
+ }
87
+ function resolveOrchestratorDefaults(settings = loadAppSettings()) {
88
+ const account = resolveThreadDefaults(settings);
89
+ const orch = settings.defaults.orchestrator;
90
+ const agent = coerceOrchestratorAgent(orch?.agent ?? account.agent);
91
+ let model = orch ? orch.model?.trim() || null : account.model;
92
+ if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
93
+ model = null;
94
+ }
95
+ return {
96
+ agent,
97
+ model,
98
+ effort: orch?.effort ?? account.effort,
99
+ fast: orch?.fast ?? account.fast,
100
+ autonomy: orch?.autonomy ?? account.autonomy
101
+ };
102
+ }
103
+ function mergeThreadOptionOverrides(defaults, overrides) {
104
+ const effort = overrides.effort === void 0 || overrides.effort === null ? defaults.effort : normalizeThinkingEffort(overrides.effort) ?? defaults.effort;
105
+ const agent = overrides.agent ?? defaults.agent;
106
+ let model = overrides.model === void 0 ? defaults.model : overrides.model?.trim() || null;
107
+ if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
108
+ model = null;
109
+ }
110
+ return {
111
+ agent,
112
+ model,
113
+ effort,
114
+ fast: overrides.fast === void 0 || overrides.fast === null ? defaults.fast : Boolean(overrides.fast),
115
+ autonomy: overrides.autonomy == null ? defaults.autonomy : normalizeAutonomy(overrides.autonomy) ?? defaults.autonomy
116
+ };
117
+ }
118
+ function resolveNewThreadOptions(overrides = {}, settings = loadAppSettings()) {
119
+ return mergeThreadOptionOverrides(resolveThreadDefaults(settings), overrides);
120
+ }
121
+ function resolveNewOrchestratorOptions(overrides = {}, settings = loadAppSettings()) {
122
+ return mergeThreadOptionOverrides(resolveOrchestratorDefaults(settings), overrides);
123
+ }
124
+
58
125
  // src/store/account-profile.ts
59
126
  var PROFILE_NOTES_MAX = 2e3;
60
127
  var LEGACY_ROLE_LABELS = {
@@ -1025,6 +1092,8 @@ function normalizeOrchestratorDefaults(raw) {
1025
1092
  if (typeof source.fast === "boolean") {
1026
1093
  out.fast = source.fast;
1027
1094
  }
1095
+ const autonomy = normalizeAutonomy(source.autonomy);
1096
+ if (autonomy) out.autonomy = autonomy;
1028
1097
  return Object.keys(out).length > 0 ? out : void 0;
1029
1098
  }
1030
1099
  function normalizeDefaults(raw) {
@@ -1044,6 +1113,8 @@ function normalizeDefaults(raw) {
1044
1113
  if (typeof source.fast === "boolean") {
1045
1114
  out.fast = source.fast;
1046
1115
  }
1116
+ const autonomy = normalizeAutonomy(source.autonomy);
1117
+ if (autonomy) out.autonomy = autonomy;
1047
1118
  const notes = foldLegacyRolesIntoNotes(source.roles, source.role, source.notes);
1048
1119
  if (notes) out.notes = notes;
1049
1120
  const orchestrator = normalizeOrchestratorDefaults(source.orchestrator);
@@ -1709,6 +1780,14 @@ function applyOrchestratorDefaultsPatch(current, patch) {
1709
1780
  next.fast = Boolean(patch.fast);
1710
1781
  }
1711
1782
  }
1783
+ if ("autonomy" in patch) {
1784
+ if (patch.autonomy == null) {
1785
+ delete next.autonomy;
1786
+ } else {
1787
+ const autonomy = normalizeAutonomy(patch.autonomy);
1788
+ if (autonomy) next.autonomy = autonomy;
1789
+ }
1790
+ }
1712
1791
  return Object.keys(next).length > 0 ? next : void 0;
1713
1792
  }
1714
1793
  function updateDefaultsSettings(patch) {
@@ -1743,6 +1822,14 @@ function updateDefaultsSettings(patch) {
1743
1822
  defaults.fast = Boolean(patch.fast);
1744
1823
  }
1745
1824
  }
1825
+ if ("autonomy" in patch) {
1826
+ if (patch.autonomy == null) {
1827
+ delete defaults.autonomy;
1828
+ } else {
1829
+ const autonomy = normalizeAutonomy(patch.autonomy);
1830
+ if (autonomy) defaults.autonomy = autonomy;
1831
+ }
1832
+ }
1746
1833
  if ("notes" in patch) {
1747
1834
  const notes = normalizeProfileNotes(patch.notes);
1748
1835
  if (!notes) delete defaults.notes;
@@ -1792,19 +1879,6 @@ function resolveProjectReviewLabel(settings, repoPath) {
1792
1879
  if (!key) return "";
1793
1880
  return settings.projects[key]?.reviewLabel?.trim() || "";
1794
1881
  }
1795
- function getDefaultAgent(settings = loadAppSettings()) {
1796
- return settings.defaults.agent ?? "claude";
1797
- }
1798
- function getDefaultModel(settings = loadAppSettings()) {
1799
- const model = settings.defaults.model?.trim();
1800
- return model || null;
1801
- }
1802
- function getDefaultEffort(settings = loadAppSettings()) {
1803
- return normalizeThinkingEffort(settings.defaults.effort) ?? "high";
1804
- }
1805
- function getDefaultFast(settings = loadAppSettings()) {
1806
- return settings.defaults.fast === true;
1807
- }
1808
1882
  function resolveAccountProfileFromSettings(settings = loadAppSettings()) {
1809
1883
  return resolveViewerProfile(settings.defaults);
1810
1884
  }
@@ -1869,49 +1943,6 @@ function writeViewerContext(input) {
1869
1943
  updateDefaultsSettings({ notes: proposed || null });
1870
1944
  return { ok: true, scope: "account", context: proposed };
1871
1945
  }
1872
- function resolveThreadDefaults(settings = loadAppSettings()) {
1873
- return {
1874
- agent: getDefaultAgent(settings),
1875
- model: getDefaultModel(settings),
1876
- effort: getDefaultEffort(settings),
1877
- fast: getDefaultFast(settings)
1878
- };
1879
- }
1880
- function resolveOrchestratorDefaults(settings = loadAppSettings()) {
1881
- const account = resolveThreadDefaults(settings);
1882
- const orch = settings.defaults.orchestrator;
1883
- const agent = coerceOrchestratorAgent(orch?.agent ?? account.agent);
1884
- let model = orch ? orch.model?.trim() || null : account.model;
1885
- if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
1886
- model = null;
1887
- }
1888
- return {
1889
- agent,
1890
- model,
1891
- effort: orch?.effort ?? account.effort,
1892
- fast: orch?.fast ?? account.fast
1893
- };
1894
- }
1895
- function mergeThreadOptionOverrides(defaults, overrides) {
1896
- const effort = overrides.effort === void 0 || overrides.effort === null ? defaults.effort : normalizeThinkingEffort(overrides.effort) ?? defaults.effort;
1897
- const agent = overrides.agent ?? defaults.agent;
1898
- let model = overrides.model === void 0 ? defaults.model : overrides.model?.trim() || null;
1899
- if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
1900
- model = null;
1901
- }
1902
- return {
1903
- agent,
1904
- model,
1905
- effort,
1906
- fast: overrides.fast === void 0 || overrides.fast === null ? defaults.fast : Boolean(overrides.fast)
1907
- };
1908
- }
1909
- function resolveNewThreadOptions(overrides = {}, settings = loadAppSettings()) {
1910
- return mergeThreadOptionOverrides(resolveThreadDefaults(settings), overrides);
1911
- }
1912
- function resolveNewOrchestratorOptions(overrides = {}, settings = loadAppSettings()) {
1913
- return mergeThreadOptionOverrides(resolveOrchestratorDefaults(settings), overrides);
1914
- }
1915
1946
  function isLinearConnected(settings = loadAppSettings()) {
1916
1947
  return hasLinearCredentials(settings.integrations);
1917
1948
  }
@@ -2319,6 +2350,15 @@ export {
2319
2350
  isOrchestratorCapableAgent,
2320
2351
  assertOrchestratorCapableAgent,
2321
2352
  coerceOrchestratorAgent,
2353
+ getDefaultAgent,
2354
+ getDefaultModel,
2355
+ getDefaultEffort,
2356
+ getDefaultFast,
2357
+ getDefaultAutonomy,
2358
+ resolveThreadDefaults,
2359
+ resolveOrchestratorDefaults,
2360
+ resolveNewThreadOptions,
2361
+ resolveNewOrchestratorOptions,
2322
2362
  PROFILE_NOTES_MAX,
2323
2363
  foldLegacyRolesIntoNotes,
2324
2364
  resolveAccountProfile,
@@ -2372,18 +2412,10 @@ export {
2372
2412
  updateDefaultsSettings,
2373
2413
  updateProjectProfileSettings,
2374
2414
  resolveProjectReviewLabel,
2375
- getDefaultAgent,
2376
- getDefaultModel,
2377
- getDefaultEffort,
2378
- getDefaultFast,
2379
2415
  resolveAccountProfileFromSettings,
2380
2416
  resolveViewerProfileForRepo,
2381
2417
  readViewerContext,
2382
2418
  writeViewerContext,
2383
- resolveThreadDefaults,
2384
- resolveOrchestratorDefaults,
2385
- resolveNewThreadOptions,
2386
- resolveNewOrchestratorOptions,
2387
2419
  isLinearConnected,
2388
2420
  saveLinearOAuth,
2389
2421
  disconnectLinearConnection,
@@ -3,7 +3,7 @@ import {
3
3
  ensureGhPreferOrigin,
4
4
  resolveGithubRepoSlug,
5
5
  resolveRepoRoot
6
- } from "./chunk-BIPXOHZI.js";
6
+ } from "./chunk-BPBDGJ43.js";
7
7
  import {
8
8
  allocateTeamName,
9
9
  createEmptyThread,
@@ -12,7 +12,7 @@ import {
12
12
  teamSlugFromName,
13
13
  updateThread,
14
14
  writeThread
15
- } from "./chunk-HG25AYBV.js";
15
+ } from "./chunk-CHUPIJP7.js";
16
16
  import {
17
17
  ATTACHMENTS_DIR,
18
18
  attachmentsGitignoreBody
@@ -29,7 +29,7 @@ import {
29
29
  resolveThreadDefaults,
30
30
  resolveViewerProfile,
31
31
  resolveViewerProfileForRepo
32
- } from "./chunk-A2YXQC65.js";
32
+ } from "./chunk-U7PNCYNX.js";
33
33
  import {
34
34
  appDataDir,
35
35
  globalAgentCwd,
@@ -386,12 +386,12 @@ var COORDINATOR_TOOL_PLAYBOOK = [
386
386
  "- list_projects \u2014 registered repos (path + github slug + project context when set). Use account / project context to pick the right repo for tickets or reviews.",
387
387
  "- list_board \u2014 Home Kanban of workspaces (New / Draft / Review / Approved / Merged; one card per checkout). Sibling chats on a card are separate agents, not one agent. Path to merge: no PR \u2192 draft PR \u2192 open PR \u2192 approved \u2192 merged. Archive removes the card to Settings \u2192 History (list_archive to browse, restore_workspace to bring it back). Queued/running are activity on the card, not columns. Orchestration chats are not on the board. Filters: query, repoPath, kind, column, limit.",
388
388
  `- list_branches / list_prs / list_issues \u2014 pass repoPath from list_projects. Review is PRs (the surface for assigned ticket work), not the tickets: "Get me N tickets to review" \u2192 list_prs(queue=review, limit=N) then create_workspace sourceType=pr. That is open non-draft PRs labeled with this project's ready-for-review GitHub label (Settings \u2192 Projects; default eng-review) with no individual user reviewer yet. A team request (engineering-team) is not a claim \u2014 the viewer is on that team and can pick it up; claimed means an individual account is the reviewer. Bots ignored. Use Settings \u2192 Agents / Projects context (roles, teams, labels \u2014 freeform text; project adds to account) to prefer the right queues. queue=mine is review-requested:@me; queue=approved|changes uses those labels. Also: state, label, reviewer=me|unassigned|login, query, limit default 40 max 250; raise limit or tighten when truncated. list_issues (query, assignee=me|unassigned|all|user, limit default 40 max 250) lists Linear, AbleTime, or GitHub tickets \u2014 do not use it for that review-inbox ask. When they ask for tickets to work on, follow their context (assignee=me or unassigned as it says).`,
389
- "- Find work: when they ask to find work, pick up tickets, or list reviews, use Settings \u2192 Agents (account) plus Settings \u2192 Projects (per-repo) context. Tickets \u2192 Sideboard list_issues / linear_* (Account Linear). Reviews \u2192 list_prs(queue=review). Do not call Claude Linear MCP or any other vendor Linear MCP \u2014 those HTTP connectors hang or flap on the first turn. If a vendor MCP is down or reconnecting, ignore it and keep going with Sideboard tools. Show the options \u2014 do not create_workspace or start unless they also asked to start (e.g. \u201Cfind me work and start it\u201D). Do not start this unprompted. To change that context, show the proposed text, ask_user (Save this context / Do not save), wait, then update_viewer_context with confirmed=true. Never write it without confirmation.",
389
+ "- Find work: when they ask to find work, pick up tickets, or list reviews, use Settings \u2192 Agents (account) plus Settings \u2192 Projects (per-repo) context. Tickets \u2192 Sideboard list_issues / linear_* (Account Linear). Reviews \u2192 list_prs(queue=review). Do not call Claude Linear MCP or any other vendor Linear MCP \u2014 those HTTP connectors hang or flap on the first turn. If a vendor MCP is down or reconnecting, ignore it and keep going with Sideboard tools. A failed Claude connector is not a Sideboard outage \u2014 do not mention it when the Account connection works. Show the options \u2014 do not create_workspace or start unless they also asked to start (e.g. \u201Cfind me work and start it\u201D). Do not start this unprompted. To change that context, show the proposed text, ask_user (Save this context / Do not save), wait, then update_viewer_context with confirmed=true. Never write it without confirmation.",
390
390
  "- Ticket updates: list_issues / linear_search_issues / github_search_issues with updatedSince (yesterday, 2d, or ISO). One call returns new assignments, ticket edits, and new comments \u2014 do not get_issue every ticket just to check for comments. kind=created vs updated distinguishes new tickets from existing ones.",
391
- "- linear_* (when Linear is connected) \u2014 list_teams for team key/states; linear_list_projects for project names; get/search include the project a ticket is on; get/create/update/comment with ENG-123. Worktree agents have the same Account tools \u2014 prefer they comment, update status, and create spin-offs (parent=) on their own ticket when they were asked to do the work. When reviewing a PR or ticket, do not comment or update until the user types a next step \u2014 they should work through the feedback in chat first. Do not tell the child to ask_user after the review. Scope errors: reconnect Linear in Account settings. Prefer these over any Linear MCP the CLI may still list.",
392
- "- github_* \u2014 get/comment/update/create GitHub issues via Account `gh` (#123). github_list_projects and get/search include GitHub Projects. projectsError or a missing read:project scope \u2192 `gh auth refresh -s read:project`. Worktree agents have these too. Prefer over any vendor GitHub MCP. Pass parent= for spin-offs. When reviewing a PR or ticket, do not comment, submit `gh pr review`, or update the PR/ticket until the user types a next step.",
391
+ "- linear_* (when Linear is connected) \u2014 list_teams for team key/states; linear_list_projects for project names; get/search include the project a ticket is on; get/create/update/comment with ENG-123. Worktree agents have the same Account tools \u2014 prefer they comment, update status, and create spin-offs (parent=) on their own ticket when they were asked to do the work. When reviewing a PR or ticket, do not comment or update until the user types a next step \u2014 they should work through the feedback in chat first. Do not tell the child to ask_user after the review. Scope errors: reconnect Linear in Account settings. Prefer these over any Linear MCP the CLI may still list. Worktree agents use the Claude Linear connector only when Account Linear is not set or the Sideboard call fails, and they do not mention that connector startup failure when Sideboard works.",
392
+ "- github_* \u2014 get/comment/update/create GitHub issues via Account `gh` (#123). github_list_projects and get/search include GitHub Projects. projectsError or a missing read:project scope \u2192 `gh auth refresh -s read:project`. Worktree agents have these too. Prefer Sideboard `github_*` while Account `gh` works. A failed Claude GitHub connector (`mcp_github_github`) is not a Sideboard outage \u2014 do not mention it. Use that connector only when `gh` is not set up or the Sideboard call fails. Pass parent= for spin-offs. When reviewing a PR or ticket, do not comment, submit `gh pr review`, or update the PR/ticket until the user types a next step.",
393
393
  "- abletime_* (when AbleTime is connected) \u2014 orientation first; abletime_list_projects lists projects; get/list include the project a task is on; get/comment/update/create (parent= for spin-offs); ensure_task when work has no ticket (or create_workspace from the default branch auto-creates one). Worktree agents have the same Account tools. Same review-write gate as Linear/GitHub.",
394
- "- Optional connectors (Vercel, Supabase, Sentry) in Settings \u2192 Connectors inject tokens into worktree agent env when connected. Prefer official CLIs (`vercel`, `supabase`, `sentry-cli`). When Settings \u2192 Connectors has a PostHog personal API key, PostHog is the Sideboard tool `posthog_api` (GET by default; POST `/api/projects/:id/query/` or `/api/environments/:id/query/` is a read and does not need write=true; other POST and PATCH need write=true only when the user asked to change data). The PostHog key stays in the vault \u2014 do not read it from the environment, and do not sign in to a PostHog MCP. When no PostHog API key is set, leave the Claude PostHog connector alone. If a Vercel, Supabase, or Sentry MCP needsAuth or is unauthorized, do not sign in \u2014 use the native CLI. Tell any worktree agent (Claude / Cursor / Codex / OpenCode) to write CLI output to `.context/cli/` and read a slice. If a CLI is missing, the user presses Install CLI on that row. Do not add vendor MCPs. Git (`gh`) stays Settings \u2192 Git; issue tracking stays Settings \u2192 Issues. The phone remote is Settings \u2192 Remote \u2014 do not look up Slack users.",
394
+ "- Optional connectors (Vercel, Supabase, Sentry) in Settings \u2192 Connectors inject tokens into worktree agent env when connected. Prefer official CLIs (`vercel`, `supabase`, `sentry-cli`). When Settings \u2192 Connectors has a PostHog personal API key, PostHog is the Sideboard tool `posthog_api` (GET by default; POST `/api/projects/:id/query/` or `/api/environments/:id/query/` is a read and does not need write=true; other POST and PATCH need write=true only when the user asked to change data). The PostHog key stays in the vault \u2014 do not read it from the environment, and do not sign in to a PostHog MCP. When no PostHog API key is set, use the Claude PostHog connector. When a key is set, ignore a failed Claude PostHog connector and do not sign in to a PostHog MCP. If a Vercel, Supabase, or Sentry MCP needsAuth or is unauthorized while that Sideboard token is set, do not sign in \u2014 use the native CLI. When that token is not set or the CLI call fails, the Claude connector is the fallback. Do not mention a Claude connector startup failure when the Sideboard connection works. Tell any worktree agent (Claude / Cursor / Codex / OpenCode) to write CLI output to `.context/cli/` and read a slice. If a CLI is missing, the user presses Install CLI on that row. Do not add vendor MCPs. Git (`gh`) stays Settings \u2192 Git; issue tracking stays Settings \u2192 Issues. The phone remote is Settings \u2192 Remote \u2014 do not look up Slack users.",
395
395
  "- get_pr_stack / open_pr_stack_layers / add_stack_layer / create_pr_stack \u2014 GitHub stacked PRs (`gh stack`); one worktree per layer",
396
396
  "- list_models \u2014 only when you need a specific model (rare); otherwise omit model so Account defaults apply",
397
397
  "- list_chats / get_chat \u2014 live thread list (parent id + last message preview). get_chat on this orchestration chat lists child worktree agents (status + lastText). blockedReason is why that agent is waiting on a person. Also includes usage / lastTurnUsage. Archived workspaces and agents are list_archive, not this list.",
@@ -663,7 +663,8 @@ function createGlobalChat(opts) {
663
663
  agent: opts.agent,
664
664
  model: opts.model,
665
665
  effort: opts.effort,
666
- fast: opts.fast
666
+ fast: opts.fast,
667
+ autonomy: opts.autonomy
667
668
  });
668
669
  const agent = assertOrchestratorCapableAgent(resolved.agent);
669
670
  const worktreePath = globalAgentCwd();
@@ -677,7 +678,7 @@ function createGlobalChat(opts) {
677
678
  worktreePath,
678
679
  repoPath: GLOBAL_WORKSPACE_ID,
679
680
  agent,
680
- autonomy: opts.autonomy ?? "default",
681
+ autonomy: resolved.autonomy,
681
682
  model: resolved.model,
682
683
  effort: resolved.effort,
683
684
  fast: resolved.fast,
@@ -754,6 +755,7 @@ function ensureSlackCoordinator(teamId, userId, agent, opts) {
754
755
  if (existing.model !== defaults.model) patch.model = defaults.model;
755
756
  if (existing.effort !== defaults.effort) patch.effort = defaults.effort;
756
757
  if (existing.fast !== defaults.fast) patch.fast = defaults.fast;
758
+ if (existing.autonomy !== defaults.autonomy) patch.autonomy = defaults.autonomy;
757
759
  }
758
760
  if (Object.keys(patch).length > 0) {
759
761
  return updateThread(existing.id, patch);
@@ -812,6 +814,7 @@ function ensureCloudCoordinator(agent) {
812
814
  if (existing.model !== defaults.model) patch.model = defaults.model;
813
815
  if (existing.effort !== defaults.effort) patch.effort = defaults.effort;
814
816
  if (existing.fast !== defaults.fast) patch.fast = defaults.fast;
817
+ if (existing.autonomy !== defaults.autonomy) patch.autonomy = defaults.autonomy;
815
818
  }
816
819
  if (Object.keys(patch).length > 0) {
817
820
  return updateThread(existing.id, patch);
@@ -8,11 +8,11 @@ import {
8
8
  isGlobalThread,
9
9
  isOrchestratorThread,
10
10
  isSlackCoordinatorThread
11
- } from "./chunk-5QX2NYXL.js";
11
+ } from "./chunk-GFM63DTU.js";
12
12
  import {
13
13
  mergeAgentGitAuthEnv,
14
14
  resolveAgentGitAuthEnv
15
- } from "./chunk-BIPXOHZI.js";
15
+ } from "./chunk-BPBDGJ43.js";
16
16
  import {
17
17
  allocateTeamName,
18
18
  createEmptyThread,
@@ -23,7 +23,7 @@ import {
23
23
  updateThread,
24
24
  worktreeNameFromPath,
25
25
  writeThread
26
- } from "./chunk-HG25AYBV.js";
26
+ } from "./chunk-CHUPIJP7.js";
27
27
  import {
28
28
  ensureWorktreeSideboardIgnored
29
29
  } from "./chunk-2P4XKWV2.js";
@@ -43,7 +43,7 @@ import {
43
43
  import {
44
44
  assertOrchestratorCapableAgent,
45
45
  contextTokens
46
- } from "./chunk-A2YXQC65.js";
46
+ } from "./chunk-U7PNCYNX.js";
47
47
  import {
48
48
  stripNestedElectronEnv
49
49
  } from "./chunk-4TR3HZFT.js";
@@ -1832,7 +1832,7 @@ var PORT_RANGE_SIZE = 10;
1832
1832
  var RECLAIM_RETRY_DELAY_MS = 40;
1833
1833
  var RECLAIM_TRIES = 8;
1834
1834
  async function killReclaimable(ports, worktreePath, signal) {
1835
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-YOBSYPLT.js");
1835
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-DKWTQADV.js");
1836
1836
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1837
1837
  else killListenersOnPorts2(ports);
1838
1838
  }
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  getAbleTimeHost,
8
8
  isAbleTimeConnected
9
- } from "./chunk-PHMFAU35.js";
9
+ } from "./chunk-GCHSJCCX.js";
10
10
 
11
11
  // src/integrations/abletime-mcp.ts
12
12
  var DEFAULT_ABLETIME_HOST = "https://track.abletime.com";
@@ -155,7 +155,7 @@ function textsFromUnknown(value) {
155
155
  return "";
156
156
  }
157
157
  async function abletimeMcpRequest(method, params, opts) {
158
- const rawToken = opts?.token ?? await import("./abletime-oauth-2TOOZ2FN.js").then((m) => m.ensureAbleTimeAccessToken());
158
+ const rawToken = opts?.token ?? await import("./abletime-oauth-I2RRPVKT.js").then((m) => m.ensureAbleTimeAccessToken());
159
159
  if (!rawToken?.trim()) {
160
160
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
161
161
  }
@@ -226,9 +226,9 @@ async function callAbleTimeTool(name, args = {}, opts) {
226
226
  if (!opts?.token && !isAbleTimeConnected()) {
227
227
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
228
228
  }
229
- const rawToken = opts?.token ?? await import("./abletime-oauth-2TOOZ2FN.js").then((m) => m.ensureAbleTimeAccessToken());
229
+ const rawToken = opts?.token ?? await import("./abletime-oauth-I2RRPVKT.js").then((m) => m.ensureAbleTimeAccessToken());
230
230
  if (rawToken && ableTimeUsesRest(rawToken)) {
231
- const { callAbleTimeRestTool } = await import("./abletime-rest-5TDRIFEV.js");
231
+ const { callAbleTimeRestTool } = await import("./abletime-rest-W5TLQK7C.js");
232
232
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
233
233
  }
234
234
  const requestOpts = { ...opts, pm: opts?.pm ?? abletimeToolUsesPm(name) };
@@ -244,7 +244,7 @@ async function callAbleTimeTool(name, args = {}, opts) {
244
244
  return await call();
245
245
  }
246
246
  if (rawToken && ableTimeUsesRest(rawToken) && isAbleTimeRejectedCredential(message)) {
247
- const { callAbleTimeRestTool } = await import("./abletime-rest-5TDRIFEV.js");
247
+ const { callAbleTimeRestTool } = await import("./abletime-rest-W5TLQK7C.js");
248
248
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
249
249
  }
250
250
  throw err instanceof Error ? new Error(rewriteAbleTimeError(err.message)) : err;
@@ -91,7 +91,7 @@ function connectorAuthCaution(posthog, cliConnected) {
91
91
  const signIn = posthog ? "If a connector MCP is listed but needsAuth or returns unauthorized, do not sign in to that MCP." : "If a Vercel, Supabase, or Sentry MCP is listed but needsAuth or returns unauthorized, do not sign in to that MCP.";
92
92
  const token = cliConnected ? " CLI tokens are already in this process." : "";
93
93
  const key = posthog ? " Do not read a PostHog key from the environment." : "";
94
- return `${signIn}${token}${key}`;
94
+ return `${signIn}${token}${key} When this Sideboard connection works, ignore a Claude connector that failed to start. Use the Claude connector only when this connection is not set or the CLI call fails.`;
95
95
  }
96
96
  function connectorReminderBit(spec, cli) {
97
97
  if (!spec.cli) return `${spec.label}: \`posthog_api\``;
@@ -118,14 +118,14 @@ function formatOptionalServicesReminder(integrations, cli) {
118
118
  const bits = connected.map((spec) => connectorReminderBit(spec, cli)).join(". ");
119
119
  const tokenBit = connected.some((spec) => spec.cli) ? "CLI tokens are already in this process. " : "";
120
120
  const posthog = connected.some((spec) => spec.id === "posthog");
121
- const auth = posthog ? "If a connector MCP needsAuth or is unauthorized, ignore it and use the CLI or `posthog_api`. Do not read a PostHog key from the environment." : "If a Vercel, Supabase, or Sentry MCP needsAuth or is unauthorized, ignore it and use the CLI.";
121
+ const auth = posthog ? "If a connector MCP needsAuth or is unauthorized, ignore it and use the CLI or `posthog_api` while this Sideboard connection works. Use the Claude connector only when it is not set or the call fails. Do not read a PostHog key from the environment." : "If a Vercel, Supabase, or Sentry MCP needsAuth or is unauthorized, ignore it and use the CLI while this Sideboard connection works. Use the Claude connector only when it is not set or the CLI call fails.";
122
122
  return `Settings \u2192 Connectors: ${tokenBit}${bits}. ${auth} Do not add vendor MCPs. Shell dumps from those CLIs go in \`.context/cli/\` \u2014 read a slice.`;
123
123
  }
124
124
  async function connectedCliPresence(integrations) {
125
125
  const ids = connectedOptionalServices(integrations).filter((spec) => spec.cli).map((spec) => spec.id);
126
126
  if (ids.length === 0) return void 0;
127
127
  try {
128
- const { optionalCliPresence } = await import("./optional-cli-QDIT57VD.js");
128
+ const { optionalCliPresence } = await import("./optional-cli-EMSZBYDE.js");
129
129
  return await optionalCliPresence(ids);
130
130
  } catch {
131
131
  return void 0;
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  abletimeRestUrl,
3
3
  textFromAbleTimeDoc
4
- } from "./chunk-SZ3XS2WM.js";
4
+ } from "./chunk-NZVD5EVX.js";
5
5
  import {
6
6
  assertAbleTimeCredential,
7
7
  callAbleTimeTool,
8
8
  normalizeAbleTimeHost,
9
9
  rewriteAbleTimeError
10
- } from "./chunk-JWW66PO3.js";
10
+ } from "./chunk-DV6ID6CK.js";
11
11
  import {
12
12
  httpFetch
13
13
  } from "./chunk-JAT3JFOS.js";
@@ -20,7 +20,7 @@ import {
20
20
  getAbleTimeHost,
21
21
  isAbleTimeConnected,
22
22
  saveAbleTimeConnection
23
- } from "./chunk-A2YXQC65.js";
23
+ } from "./chunk-U7PNCYNX.js";
24
24
 
25
25
  // src/integrations/issue-attachments.ts
26
26
  import { existsSync, mkdirSync, writeFileSync } from "fs";