@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/index.cjs
CHANGED
|
@@ -975,6 +975,81 @@ var init_orchestrator_capable = __esm({
|
|
|
975
975
|
}
|
|
976
976
|
});
|
|
977
977
|
|
|
978
|
+
// src/store/thread-option-defaults.ts
|
|
979
|
+
function normalizeAutonomy(value) {
|
|
980
|
+
return value === "default" || value === "full" ? value : void 0;
|
|
981
|
+
}
|
|
982
|
+
function getDefaultAgent(settings = loadAppSettings()) {
|
|
983
|
+
return settings.defaults.agent ?? "claude";
|
|
984
|
+
}
|
|
985
|
+
function getDefaultModel(settings = loadAppSettings()) {
|
|
986
|
+
const model = settings.defaults.model?.trim();
|
|
987
|
+
return model || null;
|
|
988
|
+
}
|
|
989
|
+
function getDefaultEffort(settings = loadAppSettings()) {
|
|
990
|
+
return normalizeThinkingEffort(settings.defaults.effort) ?? "high";
|
|
991
|
+
}
|
|
992
|
+
function getDefaultFast(settings = loadAppSettings()) {
|
|
993
|
+
return settings.defaults.fast === true;
|
|
994
|
+
}
|
|
995
|
+
function getDefaultAutonomy(settings = loadAppSettings()) {
|
|
996
|
+
return settings.defaults.autonomy === "default" ? "default" : "full";
|
|
997
|
+
}
|
|
998
|
+
function resolveThreadDefaults(settings = loadAppSettings()) {
|
|
999
|
+
return {
|
|
1000
|
+
agent: getDefaultAgent(settings),
|
|
1001
|
+
model: getDefaultModel(settings),
|
|
1002
|
+
effort: getDefaultEffort(settings),
|
|
1003
|
+
fast: getDefaultFast(settings),
|
|
1004
|
+
autonomy: getDefaultAutonomy(settings)
|
|
1005
|
+
};
|
|
1006
|
+
}
|
|
1007
|
+
function resolveOrchestratorDefaults(settings = loadAppSettings()) {
|
|
1008
|
+
const account = resolveThreadDefaults(settings);
|
|
1009
|
+
const orch = settings.defaults.orchestrator;
|
|
1010
|
+
const agent = coerceOrchestratorAgent(orch?.agent ?? account.agent);
|
|
1011
|
+
let model = orch ? orch.model?.trim() || null : account.model;
|
|
1012
|
+
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
1013
|
+
model = null;
|
|
1014
|
+
}
|
|
1015
|
+
return {
|
|
1016
|
+
agent,
|
|
1017
|
+
model,
|
|
1018
|
+
effort: orch?.effort ?? account.effort,
|
|
1019
|
+
fast: orch?.fast ?? account.fast,
|
|
1020
|
+
autonomy: orch?.autonomy ?? account.autonomy
|
|
1021
|
+
};
|
|
1022
|
+
}
|
|
1023
|
+
function mergeThreadOptionOverrides(defaults, overrides) {
|
|
1024
|
+
const effort = overrides.effort === void 0 || overrides.effort === null ? defaults.effort : normalizeThinkingEffort(overrides.effort) ?? defaults.effort;
|
|
1025
|
+
const agent = overrides.agent ?? defaults.agent;
|
|
1026
|
+
let model = overrides.model === void 0 ? defaults.model : overrides.model?.trim() || null;
|
|
1027
|
+
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
1028
|
+
model = null;
|
|
1029
|
+
}
|
|
1030
|
+
return {
|
|
1031
|
+
agent,
|
|
1032
|
+
model,
|
|
1033
|
+
effort,
|
|
1034
|
+
fast: overrides.fast === void 0 || overrides.fast === null ? defaults.fast : Boolean(overrides.fast),
|
|
1035
|
+
autonomy: overrides.autonomy == null ? defaults.autonomy : normalizeAutonomy(overrides.autonomy) ?? defaults.autonomy
|
|
1036
|
+
};
|
|
1037
|
+
}
|
|
1038
|
+
function resolveNewThreadOptions(overrides = {}, settings = loadAppSettings()) {
|
|
1039
|
+
return mergeThreadOptionOverrides(resolveThreadDefaults(settings), overrides);
|
|
1040
|
+
}
|
|
1041
|
+
function resolveNewOrchestratorOptions(overrides = {}, settings = loadAppSettings()) {
|
|
1042
|
+
return mergeThreadOptionOverrides(resolveOrchestratorDefaults(settings), overrides);
|
|
1043
|
+
}
|
|
1044
|
+
var init_thread_option_defaults = __esm({
|
|
1045
|
+
"src/store/thread-option-defaults.ts"() {
|
|
1046
|
+
"use strict";
|
|
1047
|
+
init_orchestrator_capable();
|
|
1048
|
+
init_thinking_effort();
|
|
1049
|
+
init_app_settings();
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
|
|
978
1053
|
// src/hook/nested-electron-env.ts
|
|
979
1054
|
function isNestedElectronEnvKey(key) {
|
|
980
1055
|
return NESTED_ELECTRON_ENV_PREFIXES.some((prefix) => key.startsWith(prefix));
|
|
@@ -2187,6 +2262,7 @@ __export(app_settings_exports, {
|
|
|
2187
2262
|
getAbleTimeAccessToken: () => getAbleTimeAccessToken,
|
|
2188
2263
|
getAbleTimeHost: () => getAbleTimeHost,
|
|
2189
2264
|
getDefaultAgent: () => getDefaultAgent,
|
|
2265
|
+
getDefaultAutonomy: () => getDefaultAutonomy,
|
|
2190
2266
|
getDefaultEffort: () => getDefaultEffort,
|
|
2191
2267
|
getDefaultFast: () => getDefaultFast,
|
|
2192
2268
|
getDefaultModel: () => getDefaultModel,
|
|
@@ -2530,6 +2606,8 @@ function normalizeOrchestratorDefaults(raw) {
|
|
|
2530
2606
|
if (typeof source.fast === "boolean") {
|
|
2531
2607
|
out.fast = source.fast;
|
|
2532
2608
|
}
|
|
2609
|
+
const autonomy = normalizeAutonomy(source.autonomy);
|
|
2610
|
+
if (autonomy) out.autonomy = autonomy;
|
|
2533
2611
|
return Object.keys(out).length > 0 ? out : void 0;
|
|
2534
2612
|
}
|
|
2535
2613
|
function normalizeDefaults(raw) {
|
|
@@ -2549,6 +2627,8 @@ function normalizeDefaults(raw) {
|
|
|
2549
2627
|
if (typeof source.fast === "boolean") {
|
|
2550
2628
|
out.fast = source.fast;
|
|
2551
2629
|
}
|
|
2630
|
+
const autonomy = normalizeAutonomy(source.autonomy);
|
|
2631
|
+
if (autonomy) out.autonomy = autonomy;
|
|
2552
2632
|
const notes = foldLegacyRolesIntoNotes(source.roles, source.role, source.notes);
|
|
2553
2633
|
if (notes) out.notes = notes;
|
|
2554
2634
|
const orchestrator = normalizeOrchestratorDefaults(source.orchestrator);
|
|
@@ -3201,6 +3281,14 @@ function applyOrchestratorDefaultsPatch(current, patch) {
|
|
|
3201
3281
|
next.fast = Boolean(patch.fast);
|
|
3202
3282
|
}
|
|
3203
3283
|
}
|
|
3284
|
+
if ("autonomy" in patch) {
|
|
3285
|
+
if (patch.autonomy == null) {
|
|
3286
|
+
delete next.autonomy;
|
|
3287
|
+
} else {
|
|
3288
|
+
const autonomy = normalizeAutonomy(patch.autonomy);
|
|
3289
|
+
if (autonomy) next.autonomy = autonomy;
|
|
3290
|
+
}
|
|
3291
|
+
}
|
|
3204
3292
|
return Object.keys(next).length > 0 ? next : void 0;
|
|
3205
3293
|
}
|
|
3206
3294
|
function updateDefaultsSettings(patch) {
|
|
@@ -3235,6 +3323,14 @@ function updateDefaultsSettings(patch) {
|
|
|
3235
3323
|
defaults.fast = Boolean(patch.fast);
|
|
3236
3324
|
}
|
|
3237
3325
|
}
|
|
3326
|
+
if ("autonomy" in patch) {
|
|
3327
|
+
if (patch.autonomy == null) {
|
|
3328
|
+
delete defaults.autonomy;
|
|
3329
|
+
} else {
|
|
3330
|
+
const autonomy = normalizeAutonomy(patch.autonomy);
|
|
3331
|
+
if (autonomy) defaults.autonomy = autonomy;
|
|
3332
|
+
}
|
|
3333
|
+
}
|
|
3238
3334
|
if ("notes" in patch) {
|
|
3239
3335
|
const notes = normalizeProfileNotes(patch.notes);
|
|
3240
3336
|
if (!notes) delete defaults.notes;
|
|
@@ -3284,19 +3380,6 @@ function resolveProjectReviewLabel(settings, repoPath) {
|
|
|
3284
3380
|
if (!key) return "";
|
|
3285
3381
|
return settings.projects[key]?.reviewLabel?.trim() || "";
|
|
3286
3382
|
}
|
|
3287
|
-
function getDefaultAgent(settings = loadAppSettings()) {
|
|
3288
|
-
return settings.defaults.agent ?? "claude";
|
|
3289
|
-
}
|
|
3290
|
-
function getDefaultModel(settings = loadAppSettings()) {
|
|
3291
|
-
const model = settings.defaults.model?.trim();
|
|
3292
|
-
return model || null;
|
|
3293
|
-
}
|
|
3294
|
-
function getDefaultEffort(settings = loadAppSettings()) {
|
|
3295
|
-
return normalizeThinkingEffort(settings.defaults.effort) ?? "high";
|
|
3296
|
-
}
|
|
3297
|
-
function getDefaultFast(settings = loadAppSettings()) {
|
|
3298
|
-
return settings.defaults.fast === true;
|
|
3299
|
-
}
|
|
3300
3383
|
function resolveAccountProfileFromSettings(settings = loadAppSettings()) {
|
|
3301
3384
|
return resolveViewerProfile(settings.defaults);
|
|
3302
3385
|
}
|
|
@@ -3359,49 +3442,6 @@ function writeViewerContext(input) {
|
|
|
3359
3442
|
updateDefaultsSettings({ notes: proposed || null });
|
|
3360
3443
|
return { ok: true, scope: "account", context: proposed };
|
|
3361
3444
|
}
|
|
3362
|
-
function resolveThreadDefaults(settings = loadAppSettings()) {
|
|
3363
|
-
return {
|
|
3364
|
-
agent: getDefaultAgent(settings),
|
|
3365
|
-
model: getDefaultModel(settings),
|
|
3366
|
-
effort: getDefaultEffort(settings),
|
|
3367
|
-
fast: getDefaultFast(settings)
|
|
3368
|
-
};
|
|
3369
|
-
}
|
|
3370
|
-
function resolveOrchestratorDefaults(settings = loadAppSettings()) {
|
|
3371
|
-
const account = resolveThreadDefaults(settings);
|
|
3372
|
-
const orch = settings.defaults.orchestrator;
|
|
3373
|
-
const agent = coerceOrchestratorAgent(orch?.agent ?? account.agent);
|
|
3374
|
-
let model = orch ? orch.model?.trim() || null : account.model;
|
|
3375
|
-
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
3376
|
-
model = null;
|
|
3377
|
-
}
|
|
3378
|
-
return {
|
|
3379
|
-
agent,
|
|
3380
|
-
model,
|
|
3381
|
-
effort: orch?.effort ?? account.effort,
|
|
3382
|
-
fast: orch?.fast ?? account.fast
|
|
3383
|
-
};
|
|
3384
|
-
}
|
|
3385
|
-
function mergeThreadOptionOverrides(defaults, overrides) {
|
|
3386
|
-
const effort = overrides.effort === void 0 || overrides.effort === null ? defaults.effort : normalizeThinkingEffort(overrides.effort) ?? defaults.effort;
|
|
3387
|
-
const agent = overrides.agent ?? defaults.agent;
|
|
3388
|
-
let model = overrides.model === void 0 ? defaults.model : overrides.model?.trim() || null;
|
|
3389
|
-
if (model && agent !== "cursor" && /^(default|auto)$/i.test(model.trim())) {
|
|
3390
|
-
model = null;
|
|
3391
|
-
}
|
|
3392
|
-
return {
|
|
3393
|
-
agent,
|
|
3394
|
-
model,
|
|
3395
|
-
effort,
|
|
3396
|
-
fast: overrides.fast === void 0 || overrides.fast === null ? defaults.fast : Boolean(overrides.fast)
|
|
3397
|
-
};
|
|
3398
|
-
}
|
|
3399
|
-
function resolveNewThreadOptions(overrides = {}, settings = loadAppSettings()) {
|
|
3400
|
-
return mergeThreadOptionOverrides(resolveThreadDefaults(settings), overrides);
|
|
3401
|
-
}
|
|
3402
|
-
function resolveNewOrchestratorOptions(overrides = {}, settings = loadAppSettings()) {
|
|
3403
|
-
return mergeThreadOptionOverrides(resolveOrchestratorDefaults(settings), overrides);
|
|
3404
|
-
}
|
|
3405
3445
|
function isLinearConnected(settings = loadAppSettings()) {
|
|
3406
3446
|
return hasLinearCredentials(settings.integrations);
|
|
3407
3447
|
}
|
|
@@ -3806,6 +3846,7 @@ var init_app_settings = __esm({
|
|
|
3806
3846
|
import_node_os4 = require("os");
|
|
3807
3847
|
import_node_path11 = require("path");
|
|
3808
3848
|
init_orchestrator_capable();
|
|
3849
|
+
init_thread_option_defaults();
|
|
3809
3850
|
init_thinking_effort();
|
|
3810
3851
|
init_nested_electron_env();
|
|
3811
3852
|
init_account_profile();
|
|
@@ -3820,6 +3861,7 @@ var init_app_settings = __esm({
|
|
|
3820
3861
|
init_managed_accounts();
|
|
3821
3862
|
init_usage_on_limit();
|
|
3822
3863
|
init_issue_source_labels();
|
|
3864
|
+
init_thread_option_defaults();
|
|
3823
3865
|
init_account_profile();
|
|
3824
3866
|
HARNESS_ENV_KEYS = {
|
|
3825
3867
|
claude: "ANTHROPIC_API_KEY",
|
|
@@ -5102,6 +5144,19 @@ function normalizeRunScriptRequest(raw) {
|
|
|
5102
5144
|
error: req.error ?? null
|
|
5103
5145
|
};
|
|
5104
5146
|
}
|
|
5147
|
+
function sanitizeIssueBlockedBy(value) {
|
|
5148
|
+
if (!Array.isArray(value)) return void 0;
|
|
5149
|
+
const out = [];
|
|
5150
|
+
const seen = /* @__PURE__ */ new Set();
|
|
5151
|
+
for (const item of value) {
|
|
5152
|
+
const id = String(item ?? "").trim();
|
|
5153
|
+
const key = id.toLowerCase();
|
|
5154
|
+
if (!id || seen.has(key)) continue;
|
|
5155
|
+
seen.add(key);
|
|
5156
|
+
out.push(id);
|
|
5157
|
+
}
|
|
5158
|
+
return out;
|
|
5159
|
+
}
|
|
5105
5160
|
function normalizeThread(raw) {
|
|
5106
5161
|
return {
|
|
5107
5162
|
...raw,
|
|
@@ -5126,6 +5181,7 @@ function normalizeThread(raw) {
|
|
|
5126
5181
|
prIsInMergeQueue: Boolean(raw.prIsInMergeQueue),
|
|
5127
5182
|
prLabels: Array.isArray(raw.prLabels) ? raw.prLabels : [],
|
|
5128
5183
|
prChecksFailed: typeof raw.prChecksFailed === "boolean" ? raw.prChecksFailed : void 0,
|
|
5184
|
+
issueBlockedBy: sanitizeIssueBlockedBy(raw.issueBlockedBy),
|
|
5129
5185
|
skipAutoArchiveOnMerge: Boolean(raw.skipAutoArchiveOnMerge),
|
|
5130
5186
|
cowboy: Boolean(raw.cowboy),
|
|
5131
5187
|
stackId: raw.stackId ?? null,
|
|
@@ -6971,6 +7027,27 @@ var init_agent_block_view = __esm({
|
|
|
6971
7027
|
}
|
|
6972
7028
|
});
|
|
6973
7029
|
|
|
7030
|
+
// src/board/issue-blocked-view.ts
|
|
7031
|
+
function issueBlockedByIds(group) {
|
|
7032
|
+
const out = [];
|
|
7033
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7034
|
+
for (const thread of group) {
|
|
7035
|
+
for (const raw of thread.issueBlockedBy ?? []) {
|
|
7036
|
+
const id = String(raw ?? "").trim();
|
|
7037
|
+
const key = id.toLowerCase();
|
|
7038
|
+
if (!id || seen.has(key)) continue;
|
|
7039
|
+
seen.add(key);
|
|
7040
|
+
out.push(id);
|
|
7041
|
+
}
|
|
7042
|
+
}
|
|
7043
|
+
return out;
|
|
7044
|
+
}
|
|
7045
|
+
var init_issue_blocked_view = __esm({
|
|
7046
|
+
"src/board/issue-blocked-view.ts"() {
|
|
7047
|
+
"use strict";
|
|
7048
|
+
}
|
|
7049
|
+
});
|
|
7050
|
+
|
|
6974
7051
|
// src/board/pr-state.ts
|
|
6975
7052
|
function isOpenPrState(prUrl, prState) {
|
|
6976
7053
|
if (!prUrl?.trim()) return false;
|
|
@@ -7709,6 +7786,7 @@ function toThreadCard(group) {
|
|
|
7709
7786
|
const thread = group[0];
|
|
7710
7787
|
const withPr = group.find((t) => t.prUrl?.trim()) ?? thread;
|
|
7711
7788
|
const tags = workspaceTagsFromGroup(group);
|
|
7789
|
+
const issueBlockedBy = issueBlockedByIds(group);
|
|
7712
7790
|
return {
|
|
7713
7791
|
kind: "thread",
|
|
7714
7792
|
id: thread.id,
|
|
@@ -7722,6 +7800,7 @@ function toThreadCard(group) {
|
|
|
7722
7800
|
link: `sideboard://chat/${thread.id}`,
|
|
7723
7801
|
...group.length > 1 ? { chatCount: group.length } : {},
|
|
7724
7802
|
...threadCardBlockFields(group) ?? {},
|
|
7803
|
+
...issueBlockedBy.length > 0 ? { issueBlockedBy } : {},
|
|
7725
7804
|
...tags.length > 0 ? { tags } : {}
|
|
7726
7805
|
};
|
|
7727
7806
|
}
|
|
@@ -7805,9 +7884,11 @@ var init_home_board = __esm({
|
|
|
7805
7884
|
init_message_parts();
|
|
7806
7885
|
init_worktree_labels();
|
|
7807
7886
|
init_agent_block_view();
|
|
7887
|
+
init_issue_blocked_view();
|
|
7808
7888
|
init_pr_state();
|
|
7809
7889
|
init_worktree_ownership();
|
|
7810
7890
|
init_worktree_list_badges();
|
|
7891
|
+
init_issue_blocked_view();
|
|
7811
7892
|
init_agent_block_view();
|
|
7812
7893
|
GLOBAL_WORKSPACE_ID = "__global__";
|
|
7813
7894
|
BOARD_COLUMN_DEFS = [
|
|
@@ -7821,7 +7902,7 @@ var init_home_board = __esm({
|
|
|
7821
7902
|
DEFAULT_WORKTREE_SORT = "created";
|
|
7822
7903
|
DEFAULTISH_BRANCH = /^(main|master|develop|development|trunk|default|head)$/;
|
|
7823
7904
|
BOARD_PAGE_SIZE = 40;
|
|
7824
|
-
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.";
|
|
7905
|
+
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.";
|
|
7825
7906
|
}
|
|
7826
7907
|
});
|
|
7827
7908
|
|
|
@@ -12400,12 +12481,12 @@ var init_coordinator_prompt = __esm({
|
|
|
12400
12481
|
"- 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.",
|
|
12401
12482
|
"- 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.",
|
|
12402
12483
|
`- 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).`,
|
|
12403
|
-
"- 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.",
|
|
12484
|
+
"- 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.",
|
|
12404
12485
|
"- 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.",
|
|
12405
|
-
"- 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.",
|
|
12406
|
-
"- 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
|
|
12486
|
+
"- 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.",
|
|
12487
|
+
"- 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.",
|
|
12407
12488
|
"- 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.",
|
|
12408
|
-
"- 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,
|
|
12489
|
+
"- 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.",
|
|
12409
12490
|
"- get_pr_stack / open_pr_stack_layers / add_stack_layer / create_pr_stack \u2014 GitHub stacked PRs (`gh stack`); one worktree per layer",
|
|
12410
12491
|
"- list_models \u2014 only when you need a specific model (rare); otherwise omit model so Account defaults apply",
|
|
12411
12492
|
"- 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.",
|
|
@@ -12550,7 +12631,8 @@ function createGlobalChat(opts) {
|
|
|
12550
12631
|
agent: opts.agent,
|
|
12551
12632
|
model: opts.model,
|
|
12552
12633
|
effort: opts.effort,
|
|
12553
|
-
fast: opts.fast
|
|
12634
|
+
fast: opts.fast,
|
|
12635
|
+
autonomy: opts.autonomy
|
|
12554
12636
|
});
|
|
12555
12637
|
const agent = assertOrchestratorCapableAgent(resolved.agent);
|
|
12556
12638
|
const worktreePath = globalAgentCwd();
|
|
@@ -12564,7 +12646,7 @@ function createGlobalChat(opts) {
|
|
|
12564
12646
|
worktreePath,
|
|
12565
12647
|
repoPath: GLOBAL_WORKSPACE_ID2,
|
|
12566
12648
|
agent,
|
|
12567
|
-
autonomy:
|
|
12649
|
+
autonomy: resolved.autonomy,
|
|
12568
12650
|
model: resolved.model,
|
|
12569
12651
|
effort: resolved.effort,
|
|
12570
12652
|
fast: resolved.fast,
|
|
@@ -12641,6 +12723,7 @@ function ensureSlackCoordinator(teamId, userId, agent, opts) {
|
|
|
12641
12723
|
if (existing.model !== defaults.model) patch.model = defaults.model;
|
|
12642
12724
|
if (existing.effort !== defaults.effort) patch.effort = defaults.effort;
|
|
12643
12725
|
if (existing.fast !== defaults.fast) patch.fast = defaults.fast;
|
|
12726
|
+
if (existing.autonomy !== defaults.autonomy) patch.autonomy = defaults.autonomy;
|
|
12644
12727
|
}
|
|
12645
12728
|
if (Object.keys(patch).length > 0) {
|
|
12646
12729
|
return updateThread(existing.id, patch);
|
|
@@ -12699,6 +12782,7 @@ function ensureCloudCoordinator(agent) {
|
|
|
12699
12782
|
if (existing.model !== defaults.model) patch.model = defaults.model;
|
|
12700
12783
|
if (existing.effort !== defaults.effort) patch.effort = defaults.effort;
|
|
12701
12784
|
if (existing.fast !== defaults.fast) patch.fast = defaults.fast;
|
|
12785
|
+
if (existing.autonomy !== defaults.autonomy) patch.autonomy = defaults.autonomy;
|
|
12702
12786
|
}
|
|
12703
12787
|
if (Object.keys(patch).length > 0) {
|
|
12704
12788
|
return updateThread(existing.id, patch);
|
|
@@ -13840,6 +13924,127 @@ var init_brightsy = __esm({
|
|
|
13840
13924
|
}
|
|
13841
13925
|
});
|
|
13842
13926
|
|
|
13927
|
+
// src/agents/claude-mcp-status.ts
|
|
13928
|
+
function mcpStatusThinkingFromClaudeInit(obj) {
|
|
13929
|
+
const raw = obj.mcp_servers ?? obj.mcpServers;
|
|
13930
|
+
const servers = [];
|
|
13931
|
+
if (Array.isArray(raw)) {
|
|
13932
|
+
for (const item of raw) {
|
|
13933
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) continue;
|
|
13934
|
+
const rec = item;
|
|
13935
|
+
const name = typeof rec.name === "string" && rec.name.trim() || typeof rec.server === "string" && rec.server.trim() || "";
|
|
13936
|
+
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "";
|
|
13937
|
+
if (name) servers.push({ name, status: status || "unknown" });
|
|
13938
|
+
}
|
|
13939
|
+
} else if (raw && typeof raw === "object") {
|
|
13940
|
+
for (const [name, value] of Object.entries(raw)) {
|
|
13941
|
+
if (!name.trim()) continue;
|
|
13942
|
+
if (typeof value === "string" && value.trim()) {
|
|
13943
|
+
servers.push({ name, status: value.trim() });
|
|
13944
|
+
continue;
|
|
13945
|
+
}
|
|
13946
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
13947
|
+
const rec = value;
|
|
13948
|
+
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "unknown";
|
|
13949
|
+
servers.push({ name, status });
|
|
13950
|
+
}
|
|
13951
|
+
}
|
|
13952
|
+
}
|
|
13953
|
+
const coverage = claudeConnectorCoverage();
|
|
13954
|
+
const sideboardOk = sideboardMcpOk(servers);
|
|
13955
|
+
const notable = servers.filter(
|
|
13956
|
+
(server) => isNotableMcpInitStatus(server, sideboardOk, coverage)
|
|
13957
|
+
);
|
|
13958
|
+
if (notable.length === 0) return null;
|
|
13959
|
+
return `MCP: ${notable.map((s) => `${s.name} ${s.status}`).join(", ")}`;
|
|
13960
|
+
}
|
|
13961
|
+
function isCleanMcpConnect(status) {
|
|
13962
|
+
return /^(connected|ok|ready|success)$/i.test(status.trim());
|
|
13963
|
+
}
|
|
13964
|
+
function isMcpAuthStatus(status) {
|
|
13965
|
+
return /needs[_-]?auth|needs authentication|unauthorized|not authenticated|authrequired/i.test(
|
|
13966
|
+
status
|
|
13967
|
+
);
|
|
13968
|
+
}
|
|
13969
|
+
function isSideboardMcpName(name) {
|
|
13970
|
+
return /^sideboard$/i.test(name.trim()) || /^mcp__sideboard$/i.test(name.trim());
|
|
13971
|
+
}
|
|
13972
|
+
function isVendorClaudeAiMcpName(name) {
|
|
13973
|
+
return /^claude\.ai\b/i.test(name.trim()) || /^mcp__claude_ai_/i.test(name.trim());
|
|
13974
|
+
}
|
|
13975
|
+
function sideboardMcpOk(servers) {
|
|
13976
|
+
const row2 = servers.find((server) => isSideboardMcpName(server.name));
|
|
13977
|
+
return Boolean(row2 && isCleanMcpConnect(row2.status));
|
|
13978
|
+
}
|
|
13979
|
+
function sideboardServiceForClaudeConnector(name) {
|
|
13980
|
+
const raw = name.trim();
|
|
13981
|
+
if (!raw || isSideboardMcpName(raw)) return null;
|
|
13982
|
+
const pluginLike = /^(?:plugin[:_]|mcp__plugin_|claude\.ai\s|(?:mcp__)?claude_ai_)/i.test(raw);
|
|
13983
|
+
const doubled = raw.match(/^mcp_([a-z0-9]+)_([a-z0-9]+)$/i);
|
|
13984
|
+
if (!pluginLike && !(doubled && doubled[1].toLowerCase() === doubled[2].toLowerCase())) {
|
|
13985
|
+
return null;
|
|
13986
|
+
}
|
|
13987
|
+
let body = raw;
|
|
13988
|
+
if (/^claude\.ai\s+/i.test(body)) body = body.replace(/^claude\.ai\s+/i, "");
|
|
13989
|
+
else if (/^(?:mcp__)?claude_ai_/i.test(body)) body = body.replace(/^(?:mcp__)?claude_ai_/i, "");
|
|
13990
|
+
else if (/^mcp__plugin_/i.test(body)) body = body.slice("mcp__plugin_".length);
|
|
13991
|
+
else if (/^plugin_/i.test(body)) body = body.slice("plugin_".length);
|
|
13992
|
+
else if (/^plugin:/i.test(body)) body = body.slice("plugin:".length);
|
|
13993
|
+
else if (/^mcp_/i.test(body)) body = body.slice("mcp_".length);
|
|
13994
|
+
const head = body.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)[0];
|
|
13995
|
+
if (!head || !SIDEBOARD_CONNECTOR_SERVICES.includes(head)) return null;
|
|
13996
|
+
return head;
|
|
13997
|
+
}
|
|
13998
|
+
function claudeConnectorCoverage() {
|
|
13999
|
+
let github = false;
|
|
14000
|
+
try {
|
|
14001
|
+
github = githubAgentAuthReady();
|
|
14002
|
+
} catch {
|
|
14003
|
+
github = false;
|
|
14004
|
+
}
|
|
14005
|
+
let linear = false;
|
|
14006
|
+
let posthog = false;
|
|
14007
|
+
let vercel = false;
|
|
14008
|
+
let supabase = false;
|
|
14009
|
+
let sentry = false;
|
|
14010
|
+
try {
|
|
14011
|
+
linear = isLinearConnected();
|
|
14012
|
+
posthog = isPosthogConnected();
|
|
14013
|
+
const integrations = loadAppSettings().integrations ?? {};
|
|
14014
|
+
if (integrations.githubPat?.trim()) github = true;
|
|
14015
|
+
vercel = Boolean(integrations.vercelToken?.trim());
|
|
14016
|
+
supabase = Boolean(integrations.supabaseAccessToken?.trim());
|
|
14017
|
+
sentry = Boolean(integrations.sentryAuthToken?.trim());
|
|
14018
|
+
} catch {
|
|
14019
|
+
}
|
|
14020
|
+
return { github, linear, posthog, vercel, supabase, sentry };
|
|
14021
|
+
}
|
|
14022
|
+
function isNotableMcpInitStatus(server, sideboardOk, coverage) {
|
|
14023
|
+
if (isCleanMcpConnect(server.status)) return false;
|
|
14024
|
+
if (isSideboardMcpName(server.name)) return true;
|
|
14025
|
+
if (isMcpAuthStatus(server.status)) return false;
|
|
14026
|
+
const service = sideboardServiceForClaudeConnector(server.name);
|
|
14027
|
+
if (service) return !(sideboardOk && coverage[service]);
|
|
14028
|
+
if (isVendorClaudeAiMcpName(server.name)) return false;
|
|
14029
|
+
return true;
|
|
14030
|
+
}
|
|
14031
|
+
var SIDEBOARD_CONNECTOR_SERVICES;
|
|
14032
|
+
var init_claude_mcp_status = __esm({
|
|
14033
|
+
"src/agents/claude-mcp-status.ts"() {
|
|
14034
|
+
"use strict";
|
|
14035
|
+
init_github_agent_auth();
|
|
14036
|
+
init_app_settings();
|
|
14037
|
+
SIDEBOARD_CONNECTOR_SERVICES = [
|
|
14038
|
+
"github",
|
|
14039
|
+
"linear",
|
|
14040
|
+
"posthog",
|
|
14041
|
+
"vercel",
|
|
14042
|
+
"supabase",
|
|
14043
|
+
"sentry"
|
|
14044
|
+
];
|
|
14045
|
+
}
|
|
14046
|
+
});
|
|
14047
|
+
|
|
13843
14048
|
// src/mcp-ui/meta.ts
|
|
13844
14049
|
function matchClaudeMcpTool(toolName, serverNames) {
|
|
13845
14050
|
const name = toolName.trim();
|
|
@@ -16324,56 +16529,6 @@ function claudeString(obj, key) {
|
|
|
16324
16529
|
const v = obj[key];
|
|
16325
16530
|
return typeof v === "string" && v.trim() ? v.trim() : void 0;
|
|
16326
16531
|
}
|
|
16327
|
-
function mcpStatusThinkingFromClaudeInit(obj) {
|
|
16328
|
-
const raw = obj.mcp_servers ?? obj.mcpServers;
|
|
16329
|
-
const servers = [];
|
|
16330
|
-
if (Array.isArray(raw)) {
|
|
16331
|
-
for (const item of raw) {
|
|
16332
|
-
if (!item || typeof item !== "object" || Array.isArray(item)) continue;
|
|
16333
|
-
const rec = item;
|
|
16334
|
-
const name = typeof rec.name === "string" && rec.name.trim() || typeof rec.server === "string" && rec.server.trim() || "";
|
|
16335
|
-
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "";
|
|
16336
|
-
if (name) servers.push({ name, status: status || "unknown" });
|
|
16337
|
-
}
|
|
16338
|
-
} else if (raw && typeof raw === "object") {
|
|
16339
|
-
for (const [name, value] of Object.entries(raw)) {
|
|
16340
|
-
if (!name.trim()) continue;
|
|
16341
|
-
if (typeof value === "string" && value.trim()) {
|
|
16342
|
-
servers.push({ name, status: value.trim() });
|
|
16343
|
-
continue;
|
|
16344
|
-
}
|
|
16345
|
-
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
16346
|
-
const rec = value;
|
|
16347
|
-
const status = typeof rec.status === "string" && rec.status.trim() || typeof rec.state === "string" && rec.state.trim() || "unknown";
|
|
16348
|
-
servers.push({ name, status });
|
|
16349
|
-
}
|
|
16350
|
-
}
|
|
16351
|
-
}
|
|
16352
|
-
const notable = servers.filter(isNotableMcpInitStatus);
|
|
16353
|
-
if (notable.length === 0) return null;
|
|
16354
|
-
return `MCP: ${notable.map((s) => `${s.name} ${s.status}`).join(", ")}`;
|
|
16355
|
-
}
|
|
16356
|
-
function isCleanMcpConnect(status) {
|
|
16357
|
-
return /^(connected|ok|ready|success)$/i.test(status.trim());
|
|
16358
|
-
}
|
|
16359
|
-
function isMcpAuthStatus(status) {
|
|
16360
|
-
return /needs[_-]?auth|needs authentication|unauthorized|not authenticated|authrequired/i.test(
|
|
16361
|
-
status
|
|
16362
|
-
);
|
|
16363
|
-
}
|
|
16364
|
-
function isSideboardMcpName(name) {
|
|
16365
|
-
return /^sideboard$/i.test(name.trim()) || /^mcp__sideboard$/i.test(name.trim());
|
|
16366
|
-
}
|
|
16367
|
-
function isVendorClaudeAiMcpName(name) {
|
|
16368
|
-
return /^claude\.ai\b/i.test(name.trim()) || /^mcp__claude_ai_/i.test(name.trim());
|
|
16369
|
-
}
|
|
16370
|
-
function isNotableMcpInitStatus(server) {
|
|
16371
|
-
if (isCleanMcpConnect(server.status)) return false;
|
|
16372
|
-
if (isSideboardMcpName(server.name)) return true;
|
|
16373
|
-
if (isVendorClaudeAiMcpName(server.name)) return false;
|
|
16374
|
-
if (isMcpAuthStatus(server.status)) return false;
|
|
16375
|
-
return true;
|
|
16376
|
-
}
|
|
16377
16532
|
function eventsFromClaudeSystem(obj) {
|
|
16378
16533
|
const subtype = claudeString(obj, "subtype") ?? "";
|
|
16379
16534
|
const parentId = claudeParentToolUseId(obj);
|
|
@@ -16521,6 +16676,7 @@ var init_claude = __esm({
|
|
|
16521
16676
|
import_node_fs39 = require("fs");
|
|
16522
16677
|
init_run();
|
|
16523
16678
|
init_app_settings();
|
|
16679
|
+
init_claude_mcp_status();
|
|
16524
16680
|
init_claude_mcp();
|
|
16525
16681
|
init_host();
|
|
16526
16682
|
init_error_detail();
|
|
@@ -25203,7 +25359,8 @@ async function createThread(input, _onSetupLine) {
|
|
|
25203
25359
|
agent: input.agent,
|
|
25204
25360
|
model: input.model,
|
|
25205
25361
|
effort: input.effort,
|
|
25206
|
-
fast: input.fast
|
|
25362
|
+
fast: input.fast,
|
|
25363
|
+
autonomy: input.autonomy
|
|
25207
25364
|
});
|
|
25208
25365
|
await requireAgent(resolved.agent);
|
|
25209
25366
|
if (input.cowboy) {
|
|
@@ -25242,7 +25399,7 @@ async function createThread(input, _onSetupLine) {
|
|
|
25242
25399
|
worktreePath: repoPath,
|
|
25243
25400
|
repoPath,
|
|
25244
25401
|
agent: resolved.agent,
|
|
25245
|
-
autonomy:
|
|
25402
|
+
autonomy: resolved.autonomy,
|
|
25246
25403
|
model: resolved.model,
|
|
25247
25404
|
effort: resolved.effort,
|
|
25248
25405
|
fast: resolved.fast,
|
|
@@ -25356,7 +25513,7 @@ async function createThread(input, _onSetupLine) {
|
|
|
25356
25513
|
worktreePath,
|
|
25357
25514
|
repoPath,
|
|
25358
25515
|
agent: resolved.agent,
|
|
25359
|
-
autonomy:
|
|
25516
|
+
autonomy: resolved.autonomy,
|
|
25360
25517
|
model: resolved.model,
|
|
25361
25518
|
effort: resolved.effort,
|
|
25362
25519
|
fast: resolved.fast,
|
|
@@ -26535,7 +26692,7 @@ async function openStackLayer(input, _onSetupLine) {
|
|
|
26535
26692
|
worktreePath,
|
|
26536
26693
|
repoPath,
|
|
26537
26694
|
agent: input.agent,
|
|
26538
|
-
autonomy: input.autonomy ??
|
|
26695
|
+
autonomy: input.autonomy ?? getDefaultAutonomy(),
|
|
26539
26696
|
model: input.model ?? null,
|
|
26540
26697
|
effort: input.effort ?? "high",
|
|
26541
26698
|
fast: Boolean(input.fast),
|
|
@@ -26744,6 +26901,7 @@ var init_stack_layers = __esm({
|
|
|
26744
26901
|
init_worktree();
|
|
26745
26902
|
init_conductor();
|
|
26746
26903
|
init_thread_store();
|
|
26904
|
+
init_app_settings();
|
|
26747
26905
|
init_workspaces();
|
|
26748
26906
|
}
|
|
26749
26907
|
});
|
|
@@ -28411,7 +28569,7 @@ function formatIssueToolsDirective(opts) {
|
|
|
28411
28569
|
if (!opts.linear && !opts.abletime && !github) return null;
|
|
28412
28570
|
const lines = [
|
|
28413
28571
|
"Issue tracking (Settings \u2192 Issues / Git \u2014 already signed in):",
|
|
28414
|
-
"- Use Sideboard `linear_*` / `github_*` / `abletime_*`
|
|
28572
|
+
"- 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."
|
|
28415
28573
|
];
|
|
28416
28574
|
if (opts.linear) {
|
|
28417
28575
|
lines.push(
|
|
@@ -28460,7 +28618,7 @@ function formatIssueToolsReminder(opts) {
|
|
|
28460
28618
|
].filter(Boolean);
|
|
28461
28619
|
const ticket = opts.ticketId?.trim();
|
|
28462
28620
|
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).";
|
|
28463
|
-
return `Issues: Sideboard ${names.join(" / ")}
|
|
28621
|
+
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.`;
|
|
28464
28622
|
}
|
|
28465
28623
|
function formatLinearReminder(opts) {
|
|
28466
28624
|
return formatIssueToolsReminder({
|
|
@@ -28813,7 +28971,7 @@ function connectorAuthCaution(posthog, cliConnected) {
|
|
|
28813
28971
|
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.";
|
|
28814
28972
|
const token = cliConnected ? " CLI tokens are already in this process." : "";
|
|
28815
28973
|
const key = posthog ? " Do not read a PostHog key from the environment." : "";
|
|
28816
|
-
return `${signIn}${token}${key}
|
|
28974
|
+
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.`;
|
|
28817
28975
|
}
|
|
28818
28976
|
function connectorReminderBit(spec, cli) {
|
|
28819
28977
|
if (!spec.cli) return `${spec.label}: \`posthog_api\``;
|
|
@@ -28840,7 +28998,7 @@ function formatOptionalServicesReminder(integrations, cli) {
|
|
|
28840
28998
|
const bits = connected.map((spec) => connectorReminderBit(spec, cli)).join(". ");
|
|
28841
28999
|
const tokenBit = connected.some((spec) => spec.cli) ? "CLI tokens are already in this process. " : "";
|
|
28842
29000
|
const posthog = connected.some((spec) => spec.id === "posthog");
|
|
28843
|
-
const auth = posthog ? "If a connector MCP needsAuth or is unauthorized, ignore it and use the CLI or `posthog_api
|
|
29001
|
+
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.";
|
|
28844
29002
|
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.`;
|
|
28845
29003
|
}
|
|
28846
29004
|
async function connectedCliPresence(integrations) {
|
|
@@ -33043,6 +33201,7 @@ __export(index_exports, {
|
|
|
33043
33201
|
getCaffeinateHold: () => getCaffeinateHold,
|
|
33044
33202
|
getClaudePlanUsage: () => getClaudePlanUsage,
|
|
33045
33203
|
getDefaultAgent: () => getDefaultAgent,
|
|
33204
|
+
getDefaultAutonomy: () => getDefaultAutonomy,
|
|
33046
33205
|
getDefaultEffort: () => getDefaultEffort,
|
|
33047
33206
|
getDefaultFast: () => getDefaultFast,
|
|
33048
33207
|
getDefaultModel: () => getDefaultModel,
|
|
@@ -34764,7 +34923,8 @@ function row(resolved) {
|
|
|
34764
34923
|
agent: resolved.agent,
|
|
34765
34924
|
model: resolved.model,
|
|
34766
34925
|
effort: resolved.effort,
|
|
34767
|
-
fast: resolved.fast
|
|
34926
|
+
fast: resolved.fast,
|
|
34927
|
+
autonomy: resolved.autonomy
|
|
34768
34928
|
};
|
|
34769
34929
|
}
|
|
34770
34930
|
function phoneAccountDefaults() {
|
|
@@ -35435,7 +35595,7 @@ function draftAgentOptions(draft, defaults) {
|
|
|
35435
35595
|
effort: draft?.effort ?? defaults.effort,
|
|
35436
35596
|
fast: draft?.fast ?? defaults.fast,
|
|
35437
35597
|
planMode: Boolean(draft?.planMode),
|
|
35438
|
-
autonomy: draft?.autonomy
|
|
35598
|
+
autonomy: draft?.autonomy ?? defaults.autonomy
|
|
35439
35599
|
};
|
|
35440
35600
|
}
|
|
35441
35601
|
function createPhoneChat(agent) {
|
|
@@ -41941,6 +42101,7 @@ async function createOrchChildThread(orch, args, resolveNewThreadOptions2) {
|
|
|
41941
42101
|
model: opts.model,
|
|
41942
42102
|
effort: opts.effort,
|
|
41943
42103
|
fast: opts.fast,
|
|
42104
|
+
autonomy: opts.autonomy,
|
|
41944
42105
|
repoPath: args.repoPath,
|
|
41945
42106
|
title: args.title,
|
|
41946
42107
|
parentThreadId: parentId || null,
|
|
@@ -47758,6 +47919,7 @@ async function pollSlackOutboundWatches(opts) {
|
|
|
47758
47919
|
getCaffeinateHold,
|
|
47759
47920
|
getClaudePlanUsage,
|
|
47760
47921
|
getDefaultAgent,
|
|
47922
|
+
getDefaultAutonomy,
|
|
47761
47923
|
getDefaultEffort,
|
|
47762
47924
|
getDefaultFast,
|
|
47763
47925
|
getDefaultModel,
|