@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.
- package/dist/{abletime-SJUVZVRU.js → abletime-QK3KMRQD.js} +4 -4
- package/dist/{abletime-T5YSJLNZ.js → abletime-QQZWYJXC.js} +4 -4
- package/dist/{abletime-oauth-73TFJME4.js → abletime-oauth-CAHTMB4V.js} +3 -3
- package/dist/{abletime-oauth-2TOOZ2FN.js → abletime-oauth-I2RRPVKT.js} +3 -3
- package/dist/{abletime-rest-PNUGH2FS.js → abletime-rest-5V4KGMSY.js} +3 -3
- package/dist/{abletime-rest-5TDRIFEV.js → abletime-rest-W5TLQK7C.js} +3 -3
- package/dist/{agents-OHIE3Z7L.js → agents-5XJ7EHGU.js} +6 -6
- package/dist/{agents-PSNWJMEC.js → agents-Y3M3EKLY.js} +6 -6
- package/dist/{app-settings-CC65VPBL.js → app-settings-CZVFMOI5.js} +3 -1
- package/dist/{app-settings-DZ5AY7N5.js → app-settings-RQAFJZCD.js} +3 -1
- package/dist/{chunk-EGTCXNQM.js → chunk-53OCOGND.js} +2 -2
- package/dist/{chunk-DLGGLV2M.js → chunk-5CTG5W7S.js} +2 -2
- package/dist/{chunk-JARCAPKL.js → chunk-72OWKHFJ.js} +3 -3
- package/dist/{chunk-CW4FIIDE.js → chunk-7J2KOIYD.js} +3 -3
- package/dist/{chunk-U3J2YY4T.js → chunk-BMORGDYI.js} +48 -28
- package/dist/{chunk-BIPXOHZI.js → chunk-BPBDGJ43.js} +2 -2
- package/dist/{chunk-HG25AYBV.js → chunk-CHUPIJP7.js} +14 -0
- package/dist/{chunk-E2NJ6RH7.js → chunk-CYPFOIUK.js} +47 -27
- package/dist/{chunk-JWW66PO3.js → chunk-DV6ID6CK.js} +5 -5
- package/dist/{chunk-2JOBQUUS.js → chunk-FVTR54LY.js} +120 -56
- package/dist/{chunk-PHMFAU35.js → chunk-GCHSJCCX.js} +96 -64
- package/dist/{chunk-5QX2NYXL.js → chunk-GFM63DTU.js} +12 -9
- package/dist/{chunk-QC2TQMPJ.js → chunk-IODJCVMN.js} +5 -5
- package/dist/{chunk-CFTOKVQN.js → chunk-JRZTJ4F7.js} +5 -5
- package/dist/{chunk-62ESCTJ4.js → chunk-MBYGWNLQ.js} +3 -3
- package/dist/{chunk-OLSLE3LO.js → chunk-MKGSMPWB.js} +3 -3
- package/dist/{chunk-TDXORDN6.js → chunk-NKVNHBDB.js} +119 -55
- package/dist/{chunk-U4WACWBC.js → chunk-NXNNYY3Q.js} +2 -2
- package/dist/{chunk-SZ3XS2WM.js → chunk-NZVD5EVX.js} +2 -2
- package/dist/{chunk-WRZRX4Q7.js → chunk-OLYNM52B.js} +4 -4
- package/dist/{chunk-X3FSWWW2.js → chunk-PN32Z4JL.js} +12 -9
- package/dist/{chunk-RU6DTCCV.js → chunk-S3U4HR5F.js} +2 -2
- package/dist/{chunk-3UDRWMIM.js → chunk-U35AHE2P.js} +14 -0
- package/dist/{chunk-A2YXQC65.js → chunk-U7PNCYNX.js} +96 -64
- package/dist/{chunk-6424BACS.js → chunk-Y4WARKPW.js} +2 -2
- package/dist/{chunk-ZW7RSQHY.js → chunk-YR7NZYUT.js} +5 -5
- package/dist/{conductor-YOBSYPLT.js → conductor-DKWTQADV.js} +5 -5
- package/dist/{conductor-CTWR6NH4.js → conductor-IMKNYQWZ.js} +5 -5
- package/dist/{coordinator-prompt-GZCWQAAV.js → coordinator-prompt-HUZC4DZ2.js} +4 -4
- package/dist/{coordinator-prompt-YAZRQ4BI.js → coordinator-prompt-SPOYUZG5.js} +4 -4
- package/dist/{global-workspace-BZAVBOH3.js → global-workspace-3NNDDTFD.js} +4 -4
- package/dist/{global-workspace-H6X32IJZ.js → global-workspace-SK4JQBPN.js} +4 -4
- package/dist/index.cjs +285 -123
- package/dist/index.d.cts +84 -59
- package/dist/index.d.ts +84 -59
- package/dist/index.js +25 -21
- package/dist/mcp/run-stdio.cjs +280 -121
- package/dist/mcp/run-stdio.js +15 -14
- package/dist/{optional-cli-QDIT57VD.js → optional-cli-EMSZBYDE.js} +3 -3
- package/dist/{optional-cli-QY6V5S5N.js → optional-cli-LMSRZNH4.js} +4 -4
- package/dist/{orchestrator-BF7TKSA2.js → orchestrator-4XFRK57E.js} +9 -9
- package/dist/{orchestrator-RRHB7RNN.js → orchestrator-ZRMZ4TCL.js} +9 -9
- package/dist/{thread-store-HY22M5A7.js → thread-store-5OF6M6VZ.js} +1 -1
- package/dist/{thread-store-XMUQDO5O.js → thread-store-GOVVXQV2.js} +1 -1
- package/dist/{workspaces-BQUDYTBX.js → workspaces-52L6NZ3P.js} +4 -4
- package/dist/{workspaces-AGOLRBYZ.js → workspaces-EYNZDL45.js} +4 -4
- package/dist/{worktree-C5VI46RZ.js → worktree-BP5ICYQ2.js} +3 -3
- package/dist/{worktree-FMK57ULT.js → worktree-UCOSAI7J.js} +3 -3
- package/package.json +1 -1
package/dist/mcp/run-stdio.cjs
CHANGED
|
@@ -3812,6 +3812,81 @@ var init_thinking_effort = __esm({
|
|
|
3812
3812
|
}
|
|
3813
3813
|
});
|
|
3814
3814
|
|
|
3815
|
+
// src/store/thread-option-defaults.ts
|
|
3816
|
+
function normalizeAutonomy(value) {
|
|
3817
|
+
return value === "default" || value === "full" ? value : void 0;
|
|
3818
|
+
}
|
|
3819
|
+
function getDefaultAgent(settings = loadAppSettings()) {
|
|
3820
|
+
return settings.defaults.agent ?? "claude";
|
|
3821
|
+
}
|
|
3822
|
+
function getDefaultModel(settings = loadAppSettings()) {
|
|
3823
|
+
const model = settings.defaults.model?.trim();
|
|
3824
|
+
return model || null;
|
|
3825
|
+
}
|
|
3826
|
+
function getDefaultEffort(settings = loadAppSettings()) {
|
|
3827
|
+
return normalizeThinkingEffort(settings.defaults.effort) ?? "high";
|
|
3828
|
+
}
|
|
3829
|
+
function getDefaultFast(settings = loadAppSettings()) {
|
|
3830
|
+
return settings.defaults.fast === true;
|
|
3831
|
+
}
|
|
3832
|
+
function getDefaultAutonomy(settings = loadAppSettings()) {
|
|
3833
|
+
return settings.defaults.autonomy === "default" ? "default" : "full";
|
|
3834
|
+
}
|
|
3835
|
+
function resolveThreadDefaults(settings = loadAppSettings()) {
|
|
3836
|
+
return {
|
|
3837
|
+
agent: getDefaultAgent(settings),
|
|
3838
|
+
model: getDefaultModel(settings),
|
|
3839
|
+
effort: getDefaultEffort(settings),
|
|
3840
|
+
fast: getDefaultFast(settings),
|
|
3841
|
+
autonomy: getDefaultAutonomy(settings)
|
|
3842
|
+
};
|
|
3843
|
+
}
|
|
3844
|
+
function resolveOrchestratorDefaults(settings = loadAppSettings()) {
|
|
3845
|
+
const account = resolveThreadDefaults(settings);
|
|
3846
|
+
const orch = settings.defaults.orchestrator;
|
|
3847
|
+
const agent = coerceOrchestratorAgent(orch?.agent ?? account.agent);
|
|
3848
|
+
let model = orch ? orch.model?.trim() || null : account.model;
|
|
3849
|
+
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
3850
|
+
model = null;
|
|
3851
|
+
}
|
|
3852
|
+
return {
|
|
3853
|
+
agent,
|
|
3854
|
+
model,
|
|
3855
|
+
effort: orch?.effort ?? account.effort,
|
|
3856
|
+
fast: orch?.fast ?? account.fast,
|
|
3857
|
+
autonomy: orch?.autonomy ?? account.autonomy
|
|
3858
|
+
};
|
|
3859
|
+
}
|
|
3860
|
+
function mergeThreadOptionOverrides(defaults, overrides) {
|
|
3861
|
+
const effort = overrides.effort === void 0 || overrides.effort === null ? defaults.effort : normalizeThinkingEffort(overrides.effort) ?? defaults.effort;
|
|
3862
|
+
const agent = overrides.agent ?? defaults.agent;
|
|
3863
|
+
let model = overrides.model === void 0 ? defaults.model : overrides.model?.trim() || null;
|
|
3864
|
+
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
3865
|
+
model = null;
|
|
3866
|
+
}
|
|
3867
|
+
return {
|
|
3868
|
+
agent,
|
|
3869
|
+
model,
|
|
3870
|
+
effort,
|
|
3871
|
+
fast: overrides.fast === void 0 || overrides.fast === null ? defaults.fast : Boolean(overrides.fast),
|
|
3872
|
+
autonomy: overrides.autonomy == null ? defaults.autonomy : normalizeAutonomy(overrides.autonomy) ?? defaults.autonomy
|
|
3873
|
+
};
|
|
3874
|
+
}
|
|
3875
|
+
function resolveNewThreadOptions(overrides = {}, settings = loadAppSettings()) {
|
|
3876
|
+
return mergeThreadOptionOverrides(resolveThreadDefaults(settings), overrides);
|
|
3877
|
+
}
|
|
3878
|
+
function resolveNewOrchestratorOptions(overrides = {}, settings = loadAppSettings()) {
|
|
3879
|
+
return mergeThreadOptionOverrides(resolveOrchestratorDefaults(settings), overrides);
|
|
3880
|
+
}
|
|
3881
|
+
var init_thread_option_defaults = __esm({
|
|
3882
|
+
"src/store/thread-option-defaults.ts"() {
|
|
3883
|
+
"use strict";
|
|
3884
|
+
init_orchestrator_capable();
|
|
3885
|
+
init_thinking_effort();
|
|
3886
|
+
init_app_settings();
|
|
3887
|
+
}
|
|
3888
|
+
});
|
|
3889
|
+
|
|
3815
3890
|
// src/store/account-profile.ts
|
|
3816
3891
|
function legacyRoleLabel(role) {
|
|
3817
3892
|
const known = LEGACY_ROLE_LABELS[role];
|
|
@@ -4736,6 +4811,7 @@ __export(app_settings_exports, {
|
|
|
4736
4811
|
getAbleTimeAccessToken: () => getAbleTimeAccessToken,
|
|
4737
4812
|
getAbleTimeHost: () => getAbleTimeHost,
|
|
4738
4813
|
getDefaultAgent: () => getDefaultAgent,
|
|
4814
|
+
getDefaultAutonomy: () => getDefaultAutonomy,
|
|
4739
4815
|
getDefaultEffort: () => getDefaultEffort,
|
|
4740
4816
|
getDefaultFast: () => getDefaultFast,
|
|
4741
4817
|
getDefaultModel: () => getDefaultModel,
|
|
@@ -5079,6 +5155,8 @@ function normalizeOrchestratorDefaults(raw) {
|
|
|
5079
5155
|
if (typeof source.fast === "boolean") {
|
|
5080
5156
|
out.fast = source.fast;
|
|
5081
5157
|
}
|
|
5158
|
+
const autonomy = normalizeAutonomy(source.autonomy);
|
|
5159
|
+
if (autonomy) out.autonomy = autonomy;
|
|
5082
5160
|
return Object.keys(out).length > 0 ? out : void 0;
|
|
5083
5161
|
}
|
|
5084
5162
|
function normalizeDefaults(raw) {
|
|
@@ -5098,6 +5176,8 @@ function normalizeDefaults(raw) {
|
|
|
5098
5176
|
if (typeof source.fast === "boolean") {
|
|
5099
5177
|
out.fast = source.fast;
|
|
5100
5178
|
}
|
|
5179
|
+
const autonomy = normalizeAutonomy(source.autonomy);
|
|
5180
|
+
if (autonomy) out.autonomy = autonomy;
|
|
5101
5181
|
const notes = foldLegacyRolesIntoNotes(source.roles, source.role, source.notes);
|
|
5102
5182
|
if (notes) out.notes = notes;
|
|
5103
5183
|
const orchestrator = normalizeOrchestratorDefaults(source.orchestrator);
|
|
@@ -5750,6 +5830,14 @@ function applyOrchestratorDefaultsPatch(current, patch) {
|
|
|
5750
5830
|
next.fast = Boolean(patch.fast);
|
|
5751
5831
|
}
|
|
5752
5832
|
}
|
|
5833
|
+
if ("autonomy" in patch) {
|
|
5834
|
+
if (patch.autonomy == null) {
|
|
5835
|
+
delete next.autonomy;
|
|
5836
|
+
} else {
|
|
5837
|
+
const autonomy = normalizeAutonomy(patch.autonomy);
|
|
5838
|
+
if (autonomy) next.autonomy = autonomy;
|
|
5839
|
+
}
|
|
5840
|
+
}
|
|
5753
5841
|
return Object.keys(next).length > 0 ? next : void 0;
|
|
5754
5842
|
}
|
|
5755
5843
|
function updateDefaultsSettings(patch) {
|
|
@@ -5784,6 +5872,14 @@ function updateDefaultsSettings(patch) {
|
|
|
5784
5872
|
defaults.fast = Boolean(patch.fast);
|
|
5785
5873
|
}
|
|
5786
5874
|
}
|
|
5875
|
+
if ("autonomy" in patch) {
|
|
5876
|
+
if (patch.autonomy == null) {
|
|
5877
|
+
delete defaults.autonomy;
|
|
5878
|
+
} else {
|
|
5879
|
+
const autonomy = normalizeAutonomy(patch.autonomy);
|
|
5880
|
+
if (autonomy) defaults.autonomy = autonomy;
|
|
5881
|
+
}
|
|
5882
|
+
}
|
|
5787
5883
|
if ("notes" in patch) {
|
|
5788
5884
|
const notes = normalizeProfileNotes(patch.notes);
|
|
5789
5885
|
if (!notes) delete defaults.notes;
|
|
@@ -5833,19 +5929,6 @@ function resolveProjectReviewLabel(settings, repoPath) {
|
|
|
5833
5929
|
if (!key) return "";
|
|
5834
5930
|
return settings.projects[key]?.reviewLabel?.trim() || "";
|
|
5835
5931
|
}
|
|
5836
|
-
function getDefaultAgent(settings = loadAppSettings()) {
|
|
5837
|
-
return settings.defaults.agent ?? "claude";
|
|
5838
|
-
}
|
|
5839
|
-
function getDefaultModel(settings = loadAppSettings()) {
|
|
5840
|
-
const model = settings.defaults.model?.trim();
|
|
5841
|
-
return model || null;
|
|
5842
|
-
}
|
|
5843
|
-
function getDefaultEffort(settings = loadAppSettings()) {
|
|
5844
|
-
return normalizeThinkingEffort(settings.defaults.effort) ?? "high";
|
|
5845
|
-
}
|
|
5846
|
-
function getDefaultFast(settings = loadAppSettings()) {
|
|
5847
|
-
return settings.defaults.fast === true;
|
|
5848
|
-
}
|
|
5849
5932
|
function resolveAccountProfileFromSettings(settings = loadAppSettings()) {
|
|
5850
5933
|
return resolveViewerProfile(settings.defaults);
|
|
5851
5934
|
}
|
|
@@ -5908,49 +5991,6 @@ function writeViewerContext(input) {
|
|
|
5908
5991
|
updateDefaultsSettings({ notes: proposed || null });
|
|
5909
5992
|
return { ok: true, scope: "account", context: proposed };
|
|
5910
5993
|
}
|
|
5911
|
-
function resolveThreadDefaults(settings = loadAppSettings()) {
|
|
5912
|
-
return {
|
|
5913
|
-
agent: getDefaultAgent(settings),
|
|
5914
|
-
model: getDefaultModel(settings),
|
|
5915
|
-
effort: getDefaultEffort(settings),
|
|
5916
|
-
fast: getDefaultFast(settings)
|
|
5917
|
-
};
|
|
5918
|
-
}
|
|
5919
|
-
function resolveOrchestratorDefaults(settings = loadAppSettings()) {
|
|
5920
|
-
const account = resolveThreadDefaults(settings);
|
|
5921
|
-
const orch = settings.defaults.orchestrator;
|
|
5922
|
-
const agent = coerceOrchestratorAgent(orch?.agent ?? account.agent);
|
|
5923
|
-
let model = orch ? orch.model?.trim() || null : account.model;
|
|
5924
|
-
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
5925
|
-
model = null;
|
|
5926
|
-
}
|
|
5927
|
-
return {
|
|
5928
|
-
agent,
|
|
5929
|
-
model,
|
|
5930
|
-
effort: orch?.effort ?? account.effort,
|
|
5931
|
-
fast: orch?.fast ?? account.fast
|
|
5932
|
-
};
|
|
5933
|
-
}
|
|
5934
|
-
function mergeThreadOptionOverrides(defaults, overrides) {
|
|
5935
|
-
const effort = overrides.effort === void 0 || overrides.effort === null ? defaults.effort : normalizeThinkingEffort(overrides.effort) ?? defaults.effort;
|
|
5936
|
-
const agent = overrides.agent ?? defaults.agent;
|
|
5937
|
-
let model = overrides.model === void 0 ? defaults.model : overrides.model?.trim() || null;
|
|
5938
|
-
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
5939
|
-
model = null;
|
|
5940
|
-
}
|
|
5941
|
-
return {
|
|
5942
|
-
agent,
|
|
5943
|
-
model,
|
|
5944
|
-
effort,
|
|
5945
|
-
fast: overrides.fast === void 0 || overrides.fast === null ? defaults.fast : Boolean(overrides.fast)
|
|
5946
|
-
};
|
|
5947
|
-
}
|
|
5948
|
-
function resolveNewThreadOptions(overrides = {}, settings = loadAppSettings()) {
|
|
5949
|
-
return mergeThreadOptionOverrides(resolveThreadDefaults(settings), overrides);
|
|
5950
|
-
}
|
|
5951
|
-
function resolveNewOrchestratorOptions(overrides = {}, settings = loadAppSettings()) {
|
|
5952
|
-
return mergeThreadOptionOverrides(resolveOrchestratorDefaults(settings), overrides);
|
|
5953
|
-
}
|
|
5954
5994
|
function isLinearConnected(settings = loadAppSettings()) {
|
|
5955
5995
|
return hasLinearCredentials(settings.integrations);
|
|
5956
5996
|
}
|
|
@@ -6355,6 +6395,7 @@ var init_app_settings = __esm({
|
|
|
6355
6395
|
import_node_os6 = require("os");
|
|
6356
6396
|
import_node_path16 = require("path");
|
|
6357
6397
|
init_orchestrator_capable();
|
|
6398
|
+
init_thread_option_defaults();
|
|
6358
6399
|
init_thinking_effort();
|
|
6359
6400
|
init_nested_electron_env();
|
|
6360
6401
|
init_account_profile();
|
|
@@ -6369,6 +6410,7 @@ var init_app_settings = __esm({
|
|
|
6369
6410
|
init_managed_accounts();
|
|
6370
6411
|
init_usage_on_limit();
|
|
6371
6412
|
init_issue_source_labels();
|
|
6413
|
+
init_thread_option_defaults();
|
|
6372
6414
|
init_account_profile();
|
|
6373
6415
|
HARNESS_ENV_KEYS = {
|
|
6374
6416
|
claude: "ANTHROPIC_API_KEY",
|
|
@@ -7513,6 +7555,19 @@ function normalizeRunScriptRequest(raw) {
|
|
|
7513
7555
|
error: req.error ?? null
|
|
7514
7556
|
};
|
|
7515
7557
|
}
|
|
7558
|
+
function sanitizeIssueBlockedBy(value) {
|
|
7559
|
+
if (!Array.isArray(value)) return void 0;
|
|
7560
|
+
const out = [];
|
|
7561
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7562
|
+
for (const item of value) {
|
|
7563
|
+
const id = String(item ?? "").trim();
|
|
7564
|
+
const key = id.toLowerCase();
|
|
7565
|
+
if (!id || seen.has(key)) continue;
|
|
7566
|
+
seen.add(key);
|
|
7567
|
+
out.push(id);
|
|
7568
|
+
}
|
|
7569
|
+
return out;
|
|
7570
|
+
}
|
|
7516
7571
|
function normalizeThread(raw) {
|
|
7517
7572
|
return {
|
|
7518
7573
|
...raw,
|
|
@@ -7537,6 +7592,7 @@ function normalizeThread(raw) {
|
|
|
7537
7592
|
prIsInMergeQueue: Boolean(raw.prIsInMergeQueue),
|
|
7538
7593
|
prLabels: Array.isArray(raw.prLabels) ? raw.prLabels : [],
|
|
7539
7594
|
prChecksFailed: typeof raw.prChecksFailed === "boolean" ? raw.prChecksFailed : void 0,
|
|
7595
|
+
issueBlockedBy: sanitizeIssueBlockedBy(raw.issueBlockedBy),
|
|
7540
7596
|
skipAutoArchiveOnMerge: Boolean(raw.skipAutoArchiveOnMerge),
|
|
7541
7597
|
cowboy: Boolean(raw.cowboy),
|
|
7542
7598
|
stackId: raw.stackId ?? null,
|
|
@@ -10147,12 +10203,12 @@ var init_coordinator_prompt = __esm({
|
|
|
10147
10203
|
"- 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.",
|
|
10148
10204
|
"- 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.",
|
|
10149
10205
|
`- 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).`,
|
|
10150
|
-
"- 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.",
|
|
10206
|
+
"- 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.",
|
|
10151
10207
|
"- 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.",
|
|
10152
|
-
"- 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.",
|
|
10153
|
-
"- 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
|
|
10208
|
+
"- 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.",
|
|
10209
|
+
"- 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.",
|
|
10154
10210
|
"- 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.",
|
|
10155
|
-
"- 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,
|
|
10211
|
+
"- 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.",
|
|
10156
10212
|
"- get_pr_stack / open_pr_stack_layers / add_stack_layer / create_pr_stack \u2014 GitHub stacked PRs (`gh stack`); one worktree per layer",
|
|
10157
10213
|
"- list_models \u2014 only when you need a specific model (rare); otherwise omit model so Account defaults apply",
|
|
10158
10214
|
"- 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.",
|
|
@@ -10297,7 +10353,8 @@ function createGlobalChat(opts) {
|
|
|
10297
10353
|
agent: opts.agent,
|
|
10298
10354
|
model: opts.model,
|
|
10299
10355
|
effort: opts.effort,
|
|
10300
|
-
fast: opts.fast
|
|
10356
|
+
fast: opts.fast,
|
|
10357
|
+
autonomy: opts.autonomy
|
|
10301
10358
|
});
|
|
10302
10359
|
const agent = assertOrchestratorCapableAgent(resolved.agent);
|
|
10303
10360
|
const worktreePath = globalAgentCwd();
|
|
@@ -10311,7 +10368,7 @@ function createGlobalChat(opts) {
|
|
|
10311
10368
|
worktreePath,
|
|
10312
10369
|
repoPath: GLOBAL_WORKSPACE_ID,
|
|
10313
10370
|
agent,
|
|
10314
|
-
autonomy:
|
|
10371
|
+
autonomy: resolved.autonomy,
|
|
10315
10372
|
model: resolved.model,
|
|
10316
10373
|
effort: resolved.effort,
|
|
10317
10374
|
fast: resolved.fast,
|
|
@@ -10388,6 +10445,7 @@ function ensureSlackCoordinator(teamId, userId, agent, opts) {
|
|
|
10388
10445
|
if (existing.model !== defaults.model) patch.model = defaults.model;
|
|
10389
10446
|
if (existing.effort !== defaults.effort) patch.effort = defaults.effort;
|
|
10390
10447
|
if (existing.fast !== defaults.fast) patch.fast = defaults.fast;
|
|
10448
|
+
if (existing.autonomy !== defaults.autonomy) patch.autonomy = defaults.autonomy;
|
|
10391
10449
|
}
|
|
10392
10450
|
if (Object.keys(patch).length > 0) {
|
|
10393
10451
|
return updateThread(existing.id, patch);
|
|
@@ -10446,6 +10504,7 @@ function ensureCloudCoordinator(agent) {
|
|
|
10446
10504
|
if (existing.model !== defaults.model) patch.model = defaults.model;
|
|
10447
10505
|
if (existing.effort !== defaults.effort) patch.effort = defaults.effort;
|
|
10448
10506
|
if (existing.fast !== defaults.fast) patch.fast = defaults.fast;
|
|
10507
|
+
if (existing.autonomy !== defaults.autonomy) patch.autonomy = defaults.autonomy;
|
|
10449
10508
|
}
|
|
10450
10509
|
if (Object.keys(patch).length > 0) {
|
|
10451
10510
|
return updateThread(existing.id, patch);
|
|
@@ -11385,6 +11444,127 @@ var init_brightsy = __esm({
|
|
|
11385
11444
|
}
|
|
11386
11445
|
});
|
|
11387
11446
|
|
|
11447
|
+
// src/agents/claude-mcp-status.ts
|
|
11448
|
+
function mcpStatusThinkingFromClaudeInit(obj) {
|
|
11449
|
+
const raw = obj.mcp_servers ?? obj.mcpServers;
|
|
11450
|
+
const servers = [];
|
|
11451
|
+
if (Array.isArray(raw)) {
|
|
11452
|
+
for (const item of raw) {
|
|
11453
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) continue;
|
|
11454
|
+
const rec = item;
|
|
11455
|
+
const name = typeof rec.name === "string" && rec.name.trim() || typeof rec.server === "string" && rec.server.trim() || "";
|
|
11456
|
+
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "";
|
|
11457
|
+
if (name) servers.push({ name, status: status || "unknown" });
|
|
11458
|
+
}
|
|
11459
|
+
} else if (raw && typeof raw === "object") {
|
|
11460
|
+
for (const [name, value] of Object.entries(raw)) {
|
|
11461
|
+
if (!name.trim()) continue;
|
|
11462
|
+
if (typeof value === "string" && value.trim()) {
|
|
11463
|
+
servers.push({ name, status: value.trim() });
|
|
11464
|
+
continue;
|
|
11465
|
+
}
|
|
11466
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
11467
|
+
const rec = value;
|
|
11468
|
+
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "unknown";
|
|
11469
|
+
servers.push({ name, status });
|
|
11470
|
+
}
|
|
11471
|
+
}
|
|
11472
|
+
}
|
|
11473
|
+
const coverage = claudeConnectorCoverage();
|
|
11474
|
+
const sideboardOk = sideboardMcpOk(servers);
|
|
11475
|
+
const notable = servers.filter(
|
|
11476
|
+
(server) => isNotableMcpInitStatus(server, sideboardOk, coverage)
|
|
11477
|
+
);
|
|
11478
|
+
if (notable.length === 0) return null;
|
|
11479
|
+
return `MCP: ${notable.map((s) => `${s.name} ${s.status}`).join(", ")}`;
|
|
11480
|
+
}
|
|
11481
|
+
function isCleanMcpConnect(status) {
|
|
11482
|
+
return /^(connected|ok|ready|success)$/i.test(status.trim());
|
|
11483
|
+
}
|
|
11484
|
+
function isMcpAuthStatus(status) {
|
|
11485
|
+
return /needs[_-]?auth|needs authentication|unauthorized|not authenticated|authrequired/i.test(
|
|
11486
|
+
status
|
|
11487
|
+
);
|
|
11488
|
+
}
|
|
11489
|
+
function isSideboardMcpName(name) {
|
|
11490
|
+
return /^sideboard$/i.test(name.trim()) || /^mcp__sideboard$/i.test(name.trim());
|
|
11491
|
+
}
|
|
11492
|
+
function isVendorClaudeAiMcpName(name) {
|
|
11493
|
+
return /^claude\.ai\b/i.test(name.trim()) || /^mcp__claude_ai_/i.test(name.trim());
|
|
11494
|
+
}
|
|
11495
|
+
function sideboardMcpOk(servers) {
|
|
11496
|
+
const row = servers.find((server) => isSideboardMcpName(server.name));
|
|
11497
|
+
return Boolean(row && isCleanMcpConnect(row.status));
|
|
11498
|
+
}
|
|
11499
|
+
function sideboardServiceForClaudeConnector(name) {
|
|
11500
|
+
const raw = name.trim();
|
|
11501
|
+
if (!raw || isSideboardMcpName(raw)) return null;
|
|
11502
|
+
const pluginLike = /^(?:plugin[:_]|mcp__plugin_|claude\.ai\s|(?:mcp__)?claude_ai_)/i.test(raw);
|
|
11503
|
+
const doubled = raw.match(/^mcp_([a-z0-9]+)_([a-z0-9]+)$/i);
|
|
11504
|
+
if (!pluginLike && !(doubled && doubled[1].toLowerCase() === doubled[2].toLowerCase())) {
|
|
11505
|
+
return null;
|
|
11506
|
+
}
|
|
11507
|
+
let body = raw;
|
|
11508
|
+
if (/^claude\.ai\s+/i.test(body)) body = body.replace(/^claude\.ai\s+/i, "");
|
|
11509
|
+
else if (/^(?:mcp__)?claude_ai_/i.test(body)) body = body.replace(/^(?:mcp__)?claude_ai_/i, "");
|
|
11510
|
+
else if (/^mcp__plugin_/i.test(body)) body = body.slice("mcp__plugin_".length);
|
|
11511
|
+
else if (/^plugin_/i.test(body)) body = body.slice("plugin_".length);
|
|
11512
|
+
else if (/^plugin:/i.test(body)) body = body.slice("plugin:".length);
|
|
11513
|
+
else if (/^mcp_/i.test(body)) body = body.slice("mcp_".length);
|
|
11514
|
+
const head = body.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)[0];
|
|
11515
|
+
if (!head || !SIDEBOARD_CONNECTOR_SERVICES.includes(head)) return null;
|
|
11516
|
+
return head;
|
|
11517
|
+
}
|
|
11518
|
+
function claudeConnectorCoverage() {
|
|
11519
|
+
let github = false;
|
|
11520
|
+
try {
|
|
11521
|
+
github = githubAgentAuthReady();
|
|
11522
|
+
} catch {
|
|
11523
|
+
github = false;
|
|
11524
|
+
}
|
|
11525
|
+
let linear = false;
|
|
11526
|
+
let posthog = false;
|
|
11527
|
+
let vercel = false;
|
|
11528
|
+
let supabase = false;
|
|
11529
|
+
let sentry = false;
|
|
11530
|
+
try {
|
|
11531
|
+
linear = isLinearConnected();
|
|
11532
|
+
posthog = isPosthogConnected();
|
|
11533
|
+
const integrations = loadAppSettings().integrations ?? {};
|
|
11534
|
+
if (integrations.githubPat?.trim()) github = true;
|
|
11535
|
+
vercel = Boolean(integrations.vercelToken?.trim());
|
|
11536
|
+
supabase = Boolean(integrations.supabaseAccessToken?.trim());
|
|
11537
|
+
sentry = Boolean(integrations.sentryAuthToken?.trim());
|
|
11538
|
+
} catch {
|
|
11539
|
+
}
|
|
11540
|
+
return { github, linear, posthog, vercel, supabase, sentry };
|
|
11541
|
+
}
|
|
11542
|
+
function isNotableMcpInitStatus(server, sideboardOk, coverage) {
|
|
11543
|
+
if (isCleanMcpConnect(server.status)) return false;
|
|
11544
|
+
if (isSideboardMcpName(server.name)) return true;
|
|
11545
|
+
if (isMcpAuthStatus(server.status)) return false;
|
|
11546
|
+
const service = sideboardServiceForClaudeConnector(server.name);
|
|
11547
|
+
if (service) return !(sideboardOk && coverage[service]);
|
|
11548
|
+
if (isVendorClaudeAiMcpName(server.name)) return false;
|
|
11549
|
+
return true;
|
|
11550
|
+
}
|
|
11551
|
+
var SIDEBOARD_CONNECTOR_SERVICES;
|
|
11552
|
+
var init_claude_mcp_status = __esm({
|
|
11553
|
+
"src/agents/claude-mcp-status.ts"() {
|
|
11554
|
+
"use strict";
|
|
11555
|
+
init_github_agent_auth();
|
|
11556
|
+
init_app_settings();
|
|
11557
|
+
SIDEBOARD_CONNECTOR_SERVICES = [
|
|
11558
|
+
"github",
|
|
11559
|
+
"linear",
|
|
11560
|
+
"posthog",
|
|
11561
|
+
"vercel",
|
|
11562
|
+
"supabase",
|
|
11563
|
+
"sentry"
|
|
11564
|
+
];
|
|
11565
|
+
}
|
|
11566
|
+
});
|
|
11567
|
+
|
|
11388
11568
|
// src/mcp-ui/meta.ts
|
|
11389
11569
|
function matchClaudeMcpTool(toolName, serverNames) {
|
|
11390
11570
|
const name = toolName.trim();
|
|
@@ -13552,56 +13732,6 @@ function claudeString(obj, key) {
|
|
|
13552
13732
|
const v = obj[key];
|
|
13553
13733
|
return typeof v === "string" && v.trim() ? v.trim() : void 0;
|
|
13554
13734
|
}
|
|
13555
|
-
function mcpStatusThinkingFromClaudeInit(obj) {
|
|
13556
|
-
const raw = obj.mcp_servers ?? obj.mcpServers;
|
|
13557
|
-
const servers = [];
|
|
13558
|
-
if (Array.isArray(raw)) {
|
|
13559
|
-
for (const item of raw) {
|
|
13560
|
-
if (!item || typeof item !== "object" || Array.isArray(item)) continue;
|
|
13561
|
-
const rec = item;
|
|
13562
|
-
const name = typeof rec.name === "string" && rec.name.trim() || typeof rec.server === "string" && rec.server.trim() || "";
|
|
13563
|
-
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "";
|
|
13564
|
-
if (name) servers.push({ name, status: status || "unknown" });
|
|
13565
|
-
}
|
|
13566
|
-
} else if (raw && typeof raw === "object") {
|
|
13567
|
-
for (const [name, value] of Object.entries(raw)) {
|
|
13568
|
-
if (!name.trim()) continue;
|
|
13569
|
-
if (typeof value === "string" && value.trim()) {
|
|
13570
|
-
servers.push({ name, status: value.trim() });
|
|
13571
|
-
continue;
|
|
13572
|
-
}
|
|
13573
|
-
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
13574
|
-
const rec = value;
|
|
13575
|
-
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "unknown";
|
|
13576
|
-
servers.push({ name, status });
|
|
13577
|
-
}
|
|
13578
|
-
}
|
|
13579
|
-
}
|
|
13580
|
-
const notable = servers.filter(isNotableMcpInitStatus);
|
|
13581
|
-
if (notable.length === 0) return null;
|
|
13582
|
-
return `MCP: ${notable.map((s) => `${s.name} ${s.status}`).join(", ")}`;
|
|
13583
|
-
}
|
|
13584
|
-
function isCleanMcpConnect(status) {
|
|
13585
|
-
return /^(connected|ok|ready|success)$/i.test(status.trim());
|
|
13586
|
-
}
|
|
13587
|
-
function isMcpAuthStatus(status) {
|
|
13588
|
-
return /needs[_-]?auth|needs authentication|unauthorized|not authenticated|authrequired/i.test(
|
|
13589
|
-
status
|
|
13590
|
-
);
|
|
13591
|
-
}
|
|
13592
|
-
function isSideboardMcpName(name) {
|
|
13593
|
-
return /^sideboard$/i.test(name.trim()) || /^mcp__sideboard$/i.test(name.trim());
|
|
13594
|
-
}
|
|
13595
|
-
function isVendorClaudeAiMcpName(name) {
|
|
13596
|
-
return /^claude\.ai\b/i.test(name.trim()) || /^mcp__claude_ai_/i.test(name.trim());
|
|
13597
|
-
}
|
|
13598
|
-
function isNotableMcpInitStatus(server) {
|
|
13599
|
-
if (isCleanMcpConnect(server.status)) return false;
|
|
13600
|
-
if (isSideboardMcpName(server.name)) return true;
|
|
13601
|
-
if (isVendorClaudeAiMcpName(server.name)) return false;
|
|
13602
|
-
if (isMcpAuthStatus(server.status)) return false;
|
|
13603
|
-
return true;
|
|
13604
|
-
}
|
|
13605
13735
|
function eventsFromClaudeSystem(obj) {
|
|
13606
13736
|
const subtype = claudeString(obj, "subtype") ?? "";
|
|
13607
13737
|
const parentId = claudeParentToolUseId(obj);
|
|
@@ -13749,6 +13879,7 @@ var init_claude = __esm({
|
|
|
13749
13879
|
import_node_fs34 = require("fs");
|
|
13750
13880
|
init_run();
|
|
13751
13881
|
init_app_settings();
|
|
13882
|
+
init_claude_mcp_status();
|
|
13752
13883
|
init_claude_mcp();
|
|
13753
13884
|
init_host();
|
|
13754
13885
|
init_error_detail();
|
|
@@ -20026,6 +20157,27 @@ var init_detect = __esm({
|
|
|
20026
20157
|
}
|
|
20027
20158
|
});
|
|
20028
20159
|
|
|
20160
|
+
// src/board/issue-blocked-view.ts
|
|
20161
|
+
function issueBlockedByIds(group) {
|
|
20162
|
+
const out = [];
|
|
20163
|
+
const seen = /* @__PURE__ */ new Set();
|
|
20164
|
+
for (const thread of group) {
|
|
20165
|
+
for (const raw of thread.issueBlockedBy ?? []) {
|
|
20166
|
+
const id = String(raw ?? "").trim();
|
|
20167
|
+
const key = id.toLowerCase();
|
|
20168
|
+
if (!id || seen.has(key)) continue;
|
|
20169
|
+
seen.add(key);
|
|
20170
|
+
out.push(id);
|
|
20171
|
+
}
|
|
20172
|
+
}
|
|
20173
|
+
return out;
|
|
20174
|
+
}
|
|
20175
|
+
var init_issue_blocked_view = __esm({
|
|
20176
|
+
"src/board/issue-blocked-view.ts"() {
|
|
20177
|
+
"use strict";
|
|
20178
|
+
}
|
|
20179
|
+
});
|
|
20180
|
+
|
|
20029
20181
|
// src/board/pr-state.ts
|
|
20030
20182
|
function isOpenPrState(prUrl, prState) {
|
|
20031
20183
|
if (!prUrl?.trim()) return false;
|
|
@@ -20442,6 +20594,7 @@ function toThreadCard(group) {
|
|
|
20442
20594
|
const thread = group[0];
|
|
20443
20595
|
const withPr = group.find((t) => t.prUrl?.trim()) ?? thread;
|
|
20444
20596
|
const tags = workspaceTagsFromGroup(group);
|
|
20597
|
+
const issueBlockedBy = issueBlockedByIds(group);
|
|
20445
20598
|
return {
|
|
20446
20599
|
kind: "thread",
|
|
20447
20600
|
id: thread.id,
|
|
@@ -20455,6 +20608,7 @@ function toThreadCard(group) {
|
|
|
20455
20608
|
link: `sideboard://chat/${thread.id}`,
|
|
20456
20609
|
...group.length > 1 ? { chatCount: group.length } : {},
|
|
20457
20610
|
...threadCardBlockFields(group) ?? {},
|
|
20611
|
+
...issueBlockedBy.length > 0 ? { issueBlockedBy } : {},
|
|
20458
20612
|
...tags.length > 0 ? { tags } : {}
|
|
20459
20613
|
};
|
|
20460
20614
|
}
|
|
@@ -20538,9 +20692,11 @@ var init_home_board = __esm({
|
|
|
20538
20692
|
init_message_parts();
|
|
20539
20693
|
init_worktree_labels();
|
|
20540
20694
|
init_agent_block_view();
|
|
20695
|
+
init_issue_blocked_view();
|
|
20541
20696
|
init_pr_state();
|
|
20542
20697
|
init_worktree_ownership();
|
|
20543
20698
|
init_worktree_list_badges();
|
|
20699
|
+
init_issue_blocked_view();
|
|
20544
20700
|
init_agent_block_view();
|
|
20545
20701
|
GLOBAL_WORKSPACE_ID2 = "__global__";
|
|
20546
20702
|
BOARD_COLUMN_DEFS = [
|
|
@@ -20554,7 +20710,7 @@ var init_home_board = __esm({
|
|
|
20554
20710
|
DEFAULT_WORKTREE_SORT = "created";
|
|
20555
20711
|
DEFAULTISH_BRANCH = /^(main|master|develop|development|trunk|default|head)$/;
|
|
20556
20712
|
BOARD_PAGE_SIZE = 40;
|
|
20557
|
-
HOME_BOARD_AGENT_HINT = "Home is a Kanban of workspaces (one card per checkout; sibling chats on a card are separate agents). Do not create a second workspace for a ticket, PR, or named branch that already has a live checkout \u2014 create_workspace / start_board_card return that checkout (alreadyStarted) and its chats. Add another agent with fork_chat. Creating from the default branch still opens a new isolated workspace. Columns are the path to merge: New (no PR) \u2192 Draft (draft PR) \u2192 Review (open PR) \u2192 Approved (approved, not merged) \u2192 Merged. ownership=mine is PRs you authored (or WIP with no PR); ownership=reviewing is someone else's PR (or a review-requested checkout). Viewer login comes from gh, not a setting. 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. blockedReason means an agent on that card is waiting on a person (the question, plan approval, or a reported block) \u2014 read it and do not send_to_chat a check-in. Orchestration chats stay in the sidebar. Do not invent status.";
|
|
20713
|
+
HOME_BOARD_AGENT_HINT = "Home is a Kanban of workspaces (one card per checkout; sibling chats on a card are separate agents). Do not create a second workspace for a ticket, PR, or named branch that already has a live checkout \u2014 create_workspace / start_board_card return that checkout (alreadyStarted) and its chats. Add another agent with fork_chat. Creating from the default branch still opens a new isolated workspace. Columns are the path to merge: New (no PR) \u2192 Draft (draft PR) \u2192 Review (open PR) \u2192 Approved (approved, not merged) \u2192 Merged. ownership=mine is PRs you authored (or WIP with no PR); ownership=reviewing is someone else's PR (or a review-requested checkout). Viewer login comes from gh, not a setting. 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. blockedReason means an agent on that card is waiting on a person (the question, plan approval, or a reported block) \u2014 read it and do not send_to_chat a check-in. issueBlockedBy, when present, lists issues blocking that workspace's source ticket (the tracker dependency, not a person). Orchestration chats stay in the sidebar. Do not invent status.";
|
|
20558
20714
|
}
|
|
20559
20715
|
});
|
|
20560
20716
|
|
|
@@ -22517,7 +22673,8 @@ async function createThread(input, _onSetupLine) {
|
|
|
22517
22673
|
agent: input.agent,
|
|
22518
22674
|
model: input.model,
|
|
22519
22675
|
effort: input.effort,
|
|
22520
|
-
fast: input.fast
|
|
22676
|
+
fast: input.fast,
|
|
22677
|
+
autonomy: input.autonomy
|
|
22521
22678
|
});
|
|
22522
22679
|
await requireAgent(resolved.agent);
|
|
22523
22680
|
if (input.cowboy) {
|
|
@@ -22556,7 +22713,7 @@ async function createThread(input, _onSetupLine) {
|
|
|
22556
22713
|
worktreePath: repoPath,
|
|
22557
22714
|
repoPath,
|
|
22558
22715
|
agent: resolved.agent,
|
|
22559
|
-
autonomy:
|
|
22716
|
+
autonomy: resolved.autonomy,
|
|
22560
22717
|
model: resolved.model,
|
|
22561
22718
|
effort: resolved.effort,
|
|
22562
22719
|
fast: resolved.fast,
|
|
@@ -22670,7 +22827,7 @@ async function createThread(input, _onSetupLine) {
|
|
|
22670
22827
|
worktreePath,
|
|
22671
22828
|
repoPath,
|
|
22672
22829
|
agent: resolved.agent,
|
|
22673
|
-
autonomy:
|
|
22830
|
+
autonomy: resolved.autonomy,
|
|
22674
22831
|
model: resolved.model,
|
|
22675
22832
|
effort: resolved.effort,
|
|
22676
22833
|
fast: resolved.fast,
|
|
@@ -23831,7 +23988,7 @@ async function openStackLayer(input, _onSetupLine) {
|
|
|
23831
23988
|
worktreePath,
|
|
23832
23989
|
repoPath,
|
|
23833
23990
|
agent: input.agent,
|
|
23834
|
-
autonomy: input.autonomy ??
|
|
23991
|
+
autonomy: input.autonomy ?? getDefaultAutonomy(),
|
|
23835
23992
|
model: input.model ?? null,
|
|
23836
23993
|
effort: input.effort ?? "high",
|
|
23837
23994
|
fast: Boolean(input.fast),
|
|
@@ -24030,6 +24187,7 @@ var init_stack_layers = __esm({
|
|
|
24030
24187
|
init_worktree();
|
|
24031
24188
|
init_conductor();
|
|
24032
24189
|
init_thread_store();
|
|
24190
|
+
init_app_settings();
|
|
24033
24191
|
init_workspaces();
|
|
24034
24192
|
}
|
|
24035
24193
|
});
|
|
@@ -25693,7 +25851,7 @@ function formatIssueToolsDirective(opts) {
|
|
|
25693
25851
|
if (!opts.linear && !opts.abletime && !github) return null;
|
|
25694
25852
|
const lines = [
|
|
25695
25853
|
"Issue tracking (Settings \u2192 Issues / Git \u2014 already signed in):",
|
|
25696
|
-
"- Use Sideboard `linear_*` / `github_*` / `abletime_*`
|
|
25854
|
+
"- Use Sideboard `linear_*` / `github_*` / `abletime_*` when that Account connection is set and the call works. If it is not set, or the Sideboard call fails because the connection is down, use the Claude connector for that service. Do not mention a Claude connector that failed to start (for example `mcp_github_github` or `plugin:github:github`) when the Sideboard connection is working. A vendor issue MCP that only needsAuth is noise \u2014 do not sign in to it while Sideboard covers that service."
|
|
25697
25855
|
];
|
|
25698
25856
|
if (opts.linear) {
|
|
25699
25857
|
lines.push(
|
|
@@ -25733,7 +25891,7 @@ function formatIssueToolsReminder(opts) {
|
|
|
25733
25891
|
].filter(Boolean);
|
|
25734
25892
|
const ticket = opts.ticketId?.trim();
|
|
25735
25893
|
const ticketBit = ticket ? ` This ticket: ${ticket}${opts.ticketProvider ? ` (${opts.ticketProvider})` : ""} \u2014 get; comment/update review findings only after they ask. Spin-offs use parent=.` : " get/comment/update/create (parent= for spin-offs).";
|
|
25736
|
-
return `Issues: Sideboard ${names.join(" / ")}
|
|
25894
|
+
return `Issues: Sideboard ${names.join(" / ")} when that Account connection works. If it is not set or the call fails, use the Claude connector. Do not mention a Claude connector startup failure when Sideboard covers it.${ticketBit} Review stays in chat \u2014 do not ask_user after it; they type next steps. Authors see comments immediately.`;
|
|
25737
25895
|
}
|
|
25738
25896
|
function formatPrGateDirective() {
|
|
25739
25897
|
return [
|
|
@@ -25934,7 +26092,7 @@ function connectorAuthCaution(posthog, cliConnected) {
|
|
|
25934
26092
|
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.";
|
|
25935
26093
|
const token = cliConnected ? " CLI tokens are already in this process." : "";
|
|
25936
26094
|
const key = posthog ? " Do not read a PostHog key from the environment." : "";
|
|
25937
|
-
return `${signIn}${token}${key}
|
|
26095
|
+
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.`;
|
|
25938
26096
|
}
|
|
25939
26097
|
function connectorReminderBit(spec, cli) {
|
|
25940
26098
|
if (!spec.cli) return `${spec.label}: \`posthog_api\``;
|
|
@@ -25961,7 +26119,7 @@ function formatOptionalServicesReminder(integrations, cli) {
|
|
|
25961
26119
|
const bits = connected.map((spec) => connectorReminderBit(spec, cli)).join(". ");
|
|
25962
26120
|
const tokenBit = connected.some((spec) => spec.cli) ? "CLI tokens are already in this process. " : "";
|
|
25963
26121
|
const posthog = connected.some((spec) => spec.id === "posthog");
|
|
25964
|
-
const auth = posthog ? "If a connector MCP needsAuth or is unauthorized, ignore it and use the CLI or `posthog_api
|
|
26122
|
+
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.";
|
|
25965
26123
|
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.`;
|
|
25966
26124
|
}
|
|
25967
26125
|
async function connectedCliPresence(integrations) {
|
|
@@ -32264,6 +32422,7 @@ async function createOrchChildThread(orch, args, resolveNewThreadOptions2) {
|
|
|
32264
32422
|
model: opts.model,
|
|
32265
32423
|
effort: opts.effort,
|
|
32266
32424
|
fast: opts.fast,
|
|
32425
|
+
autonomy: opts.autonomy,
|
|
32267
32426
|
repoPath: args.repoPath,
|
|
32268
32427
|
title: args.title,
|
|
32269
32428
|
parentThreadId: parentId || null,
|