token-harness 0.1.14 → 0.1.15
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/package.json +1 -1
- package/sbom.json +3 -3
- package/token-harness.mjs +245 -60
package/package.json
CHANGED
package/sbom.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CycloneDX",
|
|
3
3
|
"specVersion": "1.5",
|
|
4
|
-
"serialNumber": "urn:uuid:
|
|
4
|
+
"serialNumber": "urn:uuid:00b7739e-3dfa-0f35-6b77-d2f92796cd4d",
|
|
5
5
|
"version": 1,
|
|
6
6
|
"metadata": {
|
|
7
7
|
"component": {
|
|
8
8
|
"type": "application",
|
|
9
9
|
"bom-ref": "token-harness",
|
|
10
10
|
"name": "token-harness",
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.15",
|
|
12
12
|
"description": "Quota-aware efficiency layer for Claude Code and Codex subscription limits.",
|
|
13
13
|
"licenses": [
|
|
14
14
|
{
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"hashes": [
|
|
21
21
|
{
|
|
22
22
|
"alg": "SHA-256",
|
|
23
|
-
"content": "
|
|
23
|
+
"content": "00b7739e3dfa0f356b77d2f92796cd4d87fa151f04c568e476b4329fcee1eb81"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
},
|
package/token-harness.mjs
CHANGED
|
@@ -9387,7 +9387,7 @@ var TOOL_VERSION;
|
|
|
9387
9387
|
var init_version2 = __esm({
|
|
9388
9388
|
"apps/cli/dist/src/version.js"() {
|
|
9389
9389
|
"use strict";
|
|
9390
|
-
TOOL_VERSION = "0.1.
|
|
9390
|
+
TOOL_VERSION = "0.1.15";
|
|
9391
9391
|
}
|
|
9392
9392
|
});
|
|
9393
9393
|
|
|
@@ -31970,6 +31970,93 @@ var init_stack_combination_reviews = __esm({
|
|
|
31970
31970
|
});
|
|
31971
31971
|
|
|
31972
31972
|
// apps/cli/dist/src/guided.js
|
|
31973
|
+
function guideSetupTarget(report, harness, provider) {
|
|
31974
|
+
const harnessDetection = report.harnesses.find((item) => item.harnessId === harness);
|
|
31975
|
+
const detection = report.providers.find((item) => item.providerId === provider);
|
|
31976
|
+
const label = name(provider);
|
|
31977
|
+
if (harnessDetection === void 0 || harnessDetection.state === "absent") {
|
|
31978
|
+
return {
|
|
31979
|
+
providerId: provider,
|
|
31980
|
+
provider: label,
|
|
31981
|
+
state: "not-applicable",
|
|
31982
|
+
reason: `${name(harness)} is not currently detected.`
|
|
31983
|
+
};
|
|
31984
|
+
}
|
|
31985
|
+
if (detection === void 0) {
|
|
31986
|
+
return {
|
|
31987
|
+
providerId: provider,
|
|
31988
|
+
provider: label,
|
|
31989
|
+
state: "not-applicable",
|
|
31990
|
+
reason: `${label} is not a managed provider in this build.`
|
|
31991
|
+
};
|
|
31992
|
+
}
|
|
31993
|
+
if (detection.configuredHarnesses.includes(harnessDetection.harnessId)) {
|
|
31994
|
+
return {
|
|
31995
|
+
providerId: provider,
|
|
31996
|
+
provider: label,
|
|
31997
|
+
state: "connected",
|
|
31998
|
+
reason: `${label} is configured for ${name(harness)}.`
|
|
31999
|
+
};
|
|
32000
|
+
}
|
|
32001
|
+
const hasReviewedHarnessSurface = COMPATIBILITY_ROWS.some((row2) => row2.provider === provider && row2.harness === harnessDetection.harnessId);
|
|
32002
|
+
if (!hasReviewedHarnessSurface) {
|
|
32003
|
+
return {
|
|
32004
|
+
providerId: provider,
|
|
32005
|
+
provider: label,
|
|
32006
|
+
state: "not-applicable",
|
|
32007
|
+
reason: `Token Harness does not manage a reviewed ${label} connection for ${name(harness)}.`
|
|
32008
|
+
};
|
|
32009
|
+
}
|
|
32010
|
+
if (detection.state === "absent" || detection.state === "available") {
|
|
32011
|
+
return {
|
|
32012
|
+
providerId: provider,
|
|
32013
|
+
provider: label,
|
|
32014
|
+
state: "unavailable",
|
|
32015
|
+
reason: `${label} is not installed in a state Token Harness can configure automatically.`
|
|
32016
|
+
};
|
|
32017
|
+
}
|
|
32018
|
+
if (detection.state === "broken") {
|
|
32019
|
+
return {
|
|
32020
|
+
providerId: provider,
|
|
32021
|
+
provider: label,
|
|
32022
|
+
state: "unavailable",
|
|
32023
|
+
reason: `${label} is detected but its current integration needs attention before setup can continue.`
|
|
32024
|
+
};
|
|
32025
|
+
}
|
|
32026
|
+
if (!detection.assignableHarnesses.includes(harnessDetection.harnessId)) {
|
|
32027
|
+
return {
|
|
32028
|
+
providerId: provider,
|
|
32029
|
+
provider: label,
|
|
32030
|
+
state: "unavailable",
|
|
32031
|
+
reason: `The installed ${label} build does not expose a reviewed automatic setup for ${name(harness)}.`
|
|
32032
|
+
};
|
|
32033
|
+
}
|
|
32034
|
+
const admission = admitManagedMutation(COMPATIBILITY_ROWS, {
|
|
32035
|
+
provider: detection.providerId,
|
|
32036
|
+
providerVersion: detection.version,
|
|
32037
|
+
harness: harnessDetection.harnessId,
|
|
32038
|
+
harnessVersion: harnessDetection.version,
|
|
32039
|
+
os: report.platform.os,
|
|
32040
|
+
wsl: report.platform.isWsl
|
|
32041
|
+
});
|
|
32042
|
+
if (admission.state !== "admitted") {
|
|
32043
|
+
return {
|
|
32044
|
+
providerId: provider,
|
|
32045
|
+
provider: label,
|
|
32046
|
+
state: "unavailable",
|
|
32047
|
+
reason: `Automatic ${label} setup is not reviewed for the installed ${name(harness)} / ${label} version combination on ${report.platform.os}.`
|
|
32048
|
+
};
|
|
32049
|
+
}
|
|
32050
|
+
return {
|
|
32051
|
+
providerId: provider,
|
|
32052
|
+
provider: label,
|
|
32053
|
+
state: "actionable",
|
|
32054
|
+
reason: `${label} can be configured automatically for ${name(harness)} with the reviewed transaction path.`
|
|
32055
|
+
};
|
|
32056
|
+
}
|
|
32057
|
+
function guideSetupTargets(report, harness) {
|
|
32058
|
+
return GUIDE_MANAGED_PROVIDERS.map((provider) => guideSetupTarget(report, harness, provider));
|
|
32059
|
+
}
|
|
31973
32060
|
function explainGuideIssue(diagnostics, fallback) {
|
|
31974
32061
|
const known = diagnostics.find((entry) => ISSUE_COPY[entry.code] !== void 0);
|
|
31975
32062
|
if (known !== void 0)
|
|
@@ -31994,7 +32081,8 @@ function stackFingerprint(report) {
|
|
|
31994
32081
|
version: item.version,
|
|
31995
32082
|
versionVerdict: item.versionVerdict,
|
|
31996
32083
|
managedByTokenHarness: item.managedByTokenHarness,
|
|
31997
|
-
configuredHarnesses: [...item.configuredHarnesses].sort()
|
|
32084
|
+
configuredHarnesses: [...item.configuredHarnesses].sort(),
|
|
32085
|
+
assignableHarnesses: [...item.assignableHarnesses].sort()
|
|
31998
32086
|
})).sort((left, right) => left.id.localeCompare(right.id));
|
|
31999
32087
|
return JSON.stringify({ harnesses, providers });
|
|
32000
32088
|
}
|
|
@@ -32212,7 +32300,7 @@ function describeChange(action, harness) {
|
|
|
32212
32300
|
files: action.affectedPaths.length
|
|
32213
32301
|
};
|
|
32214
32302
|
}
|
|
32215
|
-
var GuideError, NAMES, name, TASKS, PERIODS, STACK_COMPONENTS, ISSUE_COPY, EFFORT_LABELS, SAFETY_RULES, TASK_RULES, READ_STAGES, GuideService;
|
|
32303
|
+
var GuideError, NAMES, name, GUIDE_MANAGED_PROVIDERS, RECOMMENDED_SETUP_PROVIDERS, TASKS, PERIODS, STACK_COMPONENTS, ISSUE_COPY, EFFORT_LABELS, SAFETY_RULES, TASK_RULES, READ_STAGES, GuideService;
|
|
32216
32304
|
var init_guided = __esm({
|
|
32217
32305
|
"apps/cli/dist/src/guided.js"() {
|
|
32218
32306
|
"use strict";
|
|
@@ -32240,6 +32328,14 @@ var init_guided = __esm({
|
|
|
32240
32328
|
headroom: "Headroom"
|
|
32241
32329
|
};
|
|
32242
32330
|
name = (id) => NAMES[id] ?? id;
|
|
32331
|
+
GUIDE_MANAGED_PROVIDERS = [
|
|
32332
|
+
"rtk",
|
|
32333
|
+
"harnesstrim",
|
|
32334
|
+
"mcptoon",
|
|
32335
|
+
"gitnexus",
|
|
32336
|
+
"headroom"
|
|
32337
|
+
];
|
|
32338
|
+
RECOMMENDED_SETUP_PROVIDERS = ["rtk", "harnesstrim"];
|
|
32243
32339
|
TASKS = /* @__PURE__ */ new Set(["mechanical", "standard", "hard", "critical"]);
|
|
32244
32340
|
PERIODS = /* @__PURE__ */ new Set(["all", "7d", "30d"]);
|
|
32245
32341
|
STACK_COMPONENTS = [
|
|
@@ -32542,6 +32638,8 @@ var init_guided = __esm({
|
|
|
32542
32638
|
const providers = (doctor.data?.providers ?? []).filter((provider) => provider.state === "configured" && provider.configuredHarnesses.includes(agent.harnessId)).map((p) => p.providerId);
|
|
32543
32639
|
const usage = budget.data?.harnesses.find((item) => item.harnessId === agent.harnessId);
|
|
32544
32640
|
const observed = context.data?.harnesses.find((item) => item.harnessId === agent.harnessId);
|
|
32641
|
+
const setup = doctor.data === null ? [] : guideSetupTargets(doctor.data, agent.harnessId);
|
|
32642
|
+
const hasActionableSetup = setup.some((target) => target.state === "actionable");
|
|
32545
32643
|
return {
|
|
32546
32644
|
pending: [
|
|
32547
32645
|
...!complete2.rules ? ["reasoning"] : [],
|
|
@@ -32551,8 +32649,9 @@ var init_guided = __esm({
|
|
|
32551
32649
|
name: name(agent.harnessId),
|
|
32552
32650
|
version: agent.version,
|
|
32553
32651
|
configured: providers.length > 0,
|
|
32554
|
-
state: agent.state === "broken" ? "Needs attention" : providers.length > 0 ? "Integration configured" : "Ready to set up",
|
|
32652
|
+
state: agent.state === "broken" ? "Needs attention" : providers.length > 0 ? "Integration configured" : hasActionableSetup ? "Ready to set up" : "No reviewed automatic setup available",
|
|
32555
32653
|
providers: providers.map(name),
|
|
32654
|
+
setup,
|
|
32556
32655
|
effort: observed?.nativeEffort?.current ?? observed?.reasoningEffort ?? null,
|
|
32557
32656
|
reasoning: reasoningView(agent.harnessId, observed),
|
|
32558
32657
|
...guidance?.[agent.harnessId] ? { guidance: guidance[agent.harnessId] } : {},
|
|
@@ -32754,11 +32853,17 @@ var init_guided = __esm({
|
|
|
32754
32853
|
for (const agent of selected) {
|
|
32755
32854
|
this.record(`Preparing supported changes for ${name(agent.harnessId)}. No settings changed.`, "working");
|
|
32756
32855
|
const setupProviders = [];
|
|
32757
|
-
if (data["action"] === "setup"
|
|
32758
|
-
|
|
32759
|
-
|
|
32760
|
-
|
|
32761
|
-
|
|
32856
|
+
if (data["action"] === "setup") {
|
|
32857
|
+
const requested = data["provider"] === void 0 ? RECOMMENDED_SETUP_PROVIDERS : [String(data["provider"])];
|
|
32858
|
+
for (const setupProvider of requested) {
|
|
32859
|
+
const target = inventory.data === null ? null : guideSetupTarget(inventory.data, agent.harnessId, setupProvider);
|
|
32860
|
+
if (target?.state === "actionable") {
|
|
32861
|
+
setupProviders.push(setupProvider);
|
|
32862
|
+
} else if (target?.state === "connected") {
|
|
32863
|
+
notices.push(`${name(agent.harnessId)} \xB7 ${name(setupProvider)}: already connected. No setup change is needed.`);
|
|
32864
|
+
} else if (target !== null) {
|
|
32865
|
+
notices.push(`${name(agent.harnessId)} \xB7 ${name(setupProvider)}: ${target.reason}`);
|
|
32866
|
+
}
|
|
32762
32867
|
}
|
|
32763
32868
|
} else {
|
|
32764
32869
|
setupProviders.push(null);
|
|
@@ -32775,7 +32880,7 @@ var init_guided = __esm({
|
|
|
32775
32880
|
const report = result6.data;
|
|
32776
32881
|
if (report === null || result6.exitCode !== 0 || report.conflicts.length > 0 || report.actions.length === 0 || !report.persisted || report.planId === null) {
|
|
32777
32882
|
const subject = setupProvider !== null ? `${name(agent.harnessId)} \xB7 ${name(setupProvider)}` : name(agent.harnessId);
|
|
32778
|
-
notices.push(`${subject}: ${explainGuideIssue(result6.diagnostics, data["action"] === "effort" ? "No supported preference change is needed or available. Your current preference is kept." : data["action"] === "skill" ? "In-session guidance is already present, or an existing user-owned skill location was left untouched." : "No safe setup change is available
|
|
32883
|
+
notices.push(`${subject}: ${explainGuideIssue(result6.diagnostics, data["action"] === "effort" ? "No supported preference change is needed or available. Your current preference is kept." : data["action"] === "skill" ? "In-session guidance is already present, or an existing user-owned skill location was left untouched." : "No safe setup change is available for the current provider, agent version and platform.")}`);
|
|
32779
32884
|
continue;
|
|
32780
32885
|
}
|
|
32781
32886
|
plans.push(report.planId);
|
|
@@ -35358,22 +35463,61 @@ var init_guided_product_client = __esm({
|
|
|
35358
35463
|
return (current?.stack?.components || []).filter(component => component.configured);
|
|
35359
35464
|
}
|
|
35360
35465
|
|
|
35361
|
-
function
|
|
35362
|
-
const
|
|
35363
|
-
return
|
|
35466
|
+
function setupTarget(agentId, providerId) {
|
|
35467
|
+
const agent = activeAgents().find(item => item.id === agentId);
|
|
35468
|
+
return agent?.setup?.find(item => item.providerId === providerId) || null;
|
|
35364
35469
|
}
|
|
35365
35470
|
|
|
35366
|
-
function
|
|
35367
|
-
|
|
35471
|
+
function baselineStatusFor(agentId) {
|
|
35472
|
+
const targets = ['rtk', 'harnesstrim']
|
|
35473
|
+
.map(providerId => setupTarget(agentId, providerId))
|
|
35474
|
+
.filter(Boolean);
|
|
35475
|
+
const actionable = targets.filter(target => target.state === 'actionable');
|
|
35476
|
+
const unavailable = targets.filter(target => target.state === 'unavailable');
|
|
35477
|
+
const connected = targets.filter(target => target.state === 'connected');
|
|
35478
|
+
if (actionable.length)
|
|
35479
|
+
return {
|
|
35480
|
+
state: 'incomplete',
|
|
35481
|
+
label: 'Setup incomplete',
|
|
35482
|
+
cls: 'warn',
|
|
35483
|
+
actionable,
|
|
35484
|
+
unavailable,
|
|
35485
|
+
connected,
|
|
35486
|
+
};
|
|
35487
|
+
if (unavailable.length && connected.length === 0)
|
|
35488
|
+
return {
|
|
35489
|
+
state: 'unavailable',
|
|
35490
|
+
label: 'No automatic setup',
|
|
35491
|
+
cls: '',
|
|
35492
|
+
actionable,
|
|
35493
|
+
unavailable,
|
|
35494
|
+
connected,
|
|
35495
|
+
};
|
|
35496
|
+
if (unavailable.length)
|
|
35497
|
+
return {
|
|
35498
|
+
state: 'limited',
|
|
35499
|
+
label: 'Reviewed setup complete',
|
|
35500
|
+
cls: 'good',
|
|
35501
|
+
actionable,
|
|
35502
|
+
unavailable,
|
|
35503
|
+
connected,
|
|
35504
|
+
};
|
|
35505
|
+
return {
|
|
35506
|
+
state: 'ready',
|
|
35507
|
+
label: 'Ready',
|
|
35508
|
+
cls: 'good',
|
|
35509
|
+
actionable,
|
|
35510
|
+
unavailable,
|
|
35511
|
+
connected,
|
|
35512
|
+
};
|
|
35368
35513
|
}
|
|
35369
35514
|
|
|
35370
35515
|
function baselineIncompleteAgents() {
|
|
35371
|
-
return activeAgents().filter(agent =>
|
|
35516
|
+
return activeAgents().filter(agent => baselineStatusFor(agent.id).state === 'incomplete');
|
|
35372
35517
|
}
|
|
35373
35518
|
|
|
35374
|
-
function
|
|
35375
|
-
|
|
35376
|
-
return agentId === 'claude' || agentId === 'codex';
|
|
35519
|
+
function baselineUnavailableAgents() {
|
|
35520
|
+
return activeAgents().filter(agent => baselineStatusFor(agent.id).state === 'unavailable');
|
|
35377
35521
|
}
|
|
35378
35522
|
|
|
35379
35523
|
function candidateObservation(id) {
|
|
@@ -35454,10 +35598,19 @@ var init_guided_product_client = __esm({
|
|
|
35454
35598
|
cls: 'warn',
|
|
35455
35599
|
title: incomplete.length === 1
|
|
35456
35600
|
? 'Finish setup for ' + incomplete[0].name
|
|
35457
|
-
: 'Finish the recommended setup for your coding agents',
|
|
35458
|
-
detail: '
|
|
35601
|
+
: 'Finish the available recommended setup for your coding agents',
|
|
35602
|
+
detail: 'Every Finish setup action below has at least one reviewed provider change available for that exact agent, version and platform.',
|
|
35459
35603
|
action: 'configure',
|
|
35460
35604
|
};
|
|
35605
|
+
const unavailable = baselineUnavailableAgents();
|
|
35606
|
+
if (unavailable.length)
|
|
35607
|
+
return {
|
|
35608
|
+
label: 'No automatic setup',
|
|
35609
|
+
cls: '',
|
|
35610
|
+
title: 'No reviewed automatic setup is currently available',
|
|
35611
|
+
detail: 'Token Harness will not show a setup button that cannot complete. The agent cards below explain which provider/version combination is not currently managed.',
|
|
35612
|
+
action: 'none',
|
|
35613
|
+
};
|
|
35461
35614
|
if (!(current?.savings?.rows || []).length)
|
|
35462
35615
|
return {
|
|
35463
35616
|
label: 'Ready',
|
|
@@ -35511,7 +35664,7 @@ var init_guided_product_client = __esm({
|
|
|
35511
35664
|
);
|
|
35512
35665
|
}
|
|
35513
35666
|
|
|
35514
|
-
function componentState(component) {
|
|
35667
|
+
function componentState(id, component) {
|
|
35515
35668
|
if (!component || component.detectedState === 'absent') return { label: 'Not installed', cls: '' };
|
|
35516
35669
|
if (component.health === 'attention') return { label: 'Needs attention', cls: 'warn' };
|
|
35517
35670
|
if (component.configured)
|
|
@@ -35519,14 +35672,19 @@ var init_guided_product_client = __esm({
|
|
|
35519
35672
|
label: component.verification === 'verified' ? 'Connected · verified' : 'Connected',
|
|
35520
35673
|
cls: 'good',
|
|
35521
35674
|
};
|
|
35522
|
-
|
|
35675
|
+
const targets = activeAgents().map(agent => setupTarget(agent.id, id)).filter(Boolean);
|
|
35676
|
+
if (component.installed && targets.some(target => target.state === 'actionable'))
|
|
35677
|
+
return { label: 'Installed · setup available', cls: 'warn' };
|
|
35678
|
+
if (component.installed && targets.some(target => target.state === 'unavailable'))
|
|
35679
|
+
return { label: 'Installed · no automatic setup', cls: '' };
|
|
35680
|
+
if (component.installed) return { label: 'Installed', cls: '' };
|
|
35523
35681
|
return { label: 'Not installed', cls: '' };
|
|
35524
35682
|
}
|
|
35525
35683
|
|
|
35526
35684
|
function renderManagedTool(id) {
|
|
35527
35685
|
const info = TOOL_INFO[id];
|
|
35528
35686
|
const component = managedComponent(id);
|
|
35529
|
-
const state = componentState(component);
|
|
35687
|
+
const state = componentState(id, component);
|
|
35530
35688
|
const card = node('article', undefined, 'tool-card');
|
|
35531
35689
|
const head = node('div', undefined, 'tool-head');
|
|
35532
35690
|
const title = node('div');
|
|
@@ -35539,9 +35697,20 @@ var init_guided_product_client = __esm({
|
|
|
35539
35697
|
|
|
35540
35698
|
const facts = node('div', undefined, 'tool-facts');
|
|
35541
35699
|
if (component?.version) facts.append(node('span', 'Installed version'), node('strong', 'v' + component.version));
|
|
35700
|
+
const providerTargets = activeAgents()
|
|
35701
|
+
.map(agent => ({ agent, target: setupTarget(agent.id, id) }))
|
|
35702
|
+
.filter(item => item.target);
|
|
35703
|
+
const actionableFor = providerTargets
|
|
35704
|
+
.filter(item => item.target.state === 'actionable')
|
|
35705
|
+
.map(item => item.agent.name);
|
|
35706
|
+
const unavailableFor = providerTargets.filter(item => item.target.state === 'unavailable');
|
|
35542
35707
|
const configuredFor = component?.configuredHarnesses?.length
|
|
35543
35708
|
? component.configuredHarnesses.map(agentName).join(', ')
|
|
35544
|
-
:
|
|
35709
|
+
: actionableFor.length
|
|
35710
|
+
? 'Setup available for ' + actionableFor.join(', ')
|
|
35711
|
+
: unavailableFor.length
|
|
35712
|
+
? 'No reviewed automatic connection is available'
|
|
35713
|
+
: 'Not applicable to the detected coding agents';
|
|
35545
35714
|
facts.append(node('span', 'Connection'), node('strong', configuredFor));
|
|
35546
35715
|
if (component?.update === 'available')
|
|
35547
35716
|
facts.append(
|
|
@@ -35552,6 +35721,19 @@ var init_guided_product_client = __esm({
|
|
|
35552
35721
|
facts.append(node('span', 'Update'), node('strong', 'Newer version not reviewed yet'));
|
|
35553
35722
|
card.append(facts);
|
|
35554
35723
|
|
|
35724
|
+
if (
|
|
35725
|
+
component?.installed &&
|
|
35726
|
+
!(component?.configuredHarnesses?.length) &&
|
|
35727
|
+
actionableFor.length === 0 &&
|
|
35728
|
+
unavailableFor.length > 0
|
|
35729
|
+
)
|
|
35730
|
+
card.append(
|
|
35731
|
+
messageBox(
|
|
35732
|
+
'Why there is no Connect button',
|
|
35733
|
+
unavailableFor[0].target.reason,
|
|
35734
|
+
),
|
|
35735
|
+
);
|
|
35736
|
+
|
|
35555
35737
|
if (component?.warnings?.length) {
|
|
35556
35738
|
const attention = component.health === 'attention';
|
|
35557
35739
|
const prerequisite = !component.installed && component.nextAction?.kind === 'install-configure';
|
|
@@ -35567,25 +35749,15 @@ var init_guided_product_client = __esm({
|
|
|
35567
35749
|
|
|
35568
35750
|
const actions = node('div', undefined, 'inline-actions');
|
|
35569
35751
|
for (const agent of activeAgents()) {
|
|
35570
|
-
|
|
35571
|
-
if (
|
|
35572
|
-
|
|
35573
|
-
|
|
35574
|
-
|
|
35575
|
-
|
|
35576
|
-
|
|
35577
|
-
|
|
35578
|
-
|
|
35579
|
-
);
|
|
35580
|
-
} else {
|
|
35581
|
-
actions.append(
|
|
35582
|
-
actionButton(
|
|
35583
|
-
component?.installed ? 'Connect to ' + agent.name : 'Set up for ' + agent.name,
|
|
35584
|
-
() => reviewSetup(agent.id, id),
|
|
35585
|
-
'secondary',
|
|
35586
|
-
),
|
|
35587
|
-
);
|
|
35588
|
-
}
|
|
35752
|
+
const target = setupTarget(agent.id, id);
|
|
35753
|
+
if (target?.state !== 'actionable') continue;
|
|
35754
|
+
actions.append(
|
|
35755
|
+
actionButton(
|
|
35756
|
+
component?.installed ? 'Connect to ' + agent.name : 'Set up for ' + agent.name,
|
|
35757
|
+
() => reviewSetup(agent.id, id),
|
|
35758
|
+
'secondary',
|
|
35759
|
+
),
|
|
35760
|
+
);
|
|
35589
35761
|
}
|
|
35590
35762
|
if (component?.update === 'available')
|
|
35591
35763
|
actions.append(actionButton('Install update', () => readOnlyOperation('updates'), 'secondary'));
|
|
@@ -35612,7 +35784,7 @@ var init_guided_product_client = __esm({
|
|
|
35612
35784
|
return;
|
|
35613
35785
|
}
|
|
35614
35786
|
for (const agent of activeAgents()) {
|
|
35615
|
-
const
|
|
35787
|
+
const baseline = baselineStatusFor(agent.id);
|
|
35616
35788
|
const card = node('article', undefined, 'tool-card compact');
|
|
35617
35789
|
const head = node('div', undefined, 'tool-head');
|
|
35618
35790
|
const title = node('div');
|
|
@@ -35620,16 +35792,18 @@ var init_guided_product_client = __esm({
|
|
|
35620
35792
|
node('h3', agent.name),
|
|
35621
35793
|
node('span', agent.version ? 'v' + agent.version : 'Version unavailable', 'caption'),
|
|
35622
35794
|
);
|
|
35623
|
-
head.append(title, pill(
|
|
35624
|
-
|
|
35625
|
-
|
|
35626
|
-
|
|
35627
|
-
|
|
35628
|
-
|
|
35629
|
-
|
|
35630
|
-
|
|
35631
|
-
|
|
35632
|
-
|
|
35795
|
+
head.append(title, pill(baseline.label, baseline.cls));
|
|
35796
|
+
const detail =
|
|
35797
|
+
baseline.state === 'incomplete'
|
|
35798
|
+
? 'A reviewed automatic setup is available for ' +
|
|
35799
|
+
baseline.actionable.map(target => target.provider).join(' + ') +
|
|
35800
|
+
'. Finish setup to review and apply it.'
|
|
35801
|
+
: baseline.state === 'unavailable'
|
|
35802
|
+
? 'No reviewed automatic baseline change is available for this exact agent, provider versions and platform. Token Harness will not offer a no-op setup button.'
|
|
35803
|
+
: baseline.state === 'limited'
|
|
35804
|
+
? 'All currently reviewed automatic baseline actions are complete. Other baseline combinations are not automatically changed on this version/platform.'
|
|
35805
|
+
: 'All reviewed automatic baseline connections available for this coding agent are configured.';
|
|
35806
|
+
card.append(head, node('p', detail));
|
|
35633
35807
|
if (agent.providers?.length)
|
|
35634
35808
|
card.append(
|
|
35635
35809
|
node(
|
|
@@ -35638,10 +35812,16 @@ var init_guided_product_client = __esm({
|
|
|
35638
35812
|
'caption',
|
|
35639
35813
|
),
|
|
35640
35814
|
);
|
|
35641
|
-
if (
|
|
35815
|
+
if (baseline.state === 'incomplete') {
|
|
35642
35816
|
const actions = node('div', undefined, 'inline-actions');
|
|
35643
35817
|
actions.append(actionButton('Finish setup', () => reviewSetup(agent.id)));
|
|
35644
35818
|
card.append(actions);
|
|
35819
|
+
} else if (baseline.unavailable.length) {
|
|
35820
|
+
const details = node('details', undefined, 'agent-details');
|
|
35821
|
+
details.append(node('summary', 'Why some automatic connections are unavailable'));
|
|
35822
|
+
for (const target of baseline.unavailable)
|
|
35823
|
+
details.append(node('p', target.provider + ': ' + target.reason, 'caption'));
|
|
35824
|
+
card.append(details);
|
|
35645
35825
|
}
|
|
35646
35826
|
root.append(card);
|
|
35647
35827
|
}
|
|
@@ -35663,7 +35843,7 @@ var init_guided_product_client = __esm({
|
|
|
35663
35843
|
'Safe preview first',
|
|
35664
35844
|
provider
|
|
35665
35845
|
? 'Token Harness will inspect only ' + provider.name + ' for ' + agent.name + '. If setup is supported, the exact change appears before you confirm it.'
|
|
35666
|
-
: 'Token Harness will prepare the
|
|
35846
|
+
: 'Token Harness will prepare only the reviewed RTK/HarnessTrim changes that are actually available for ' + agent.name + ' on this version and platform. The exact files and changes appear before you confirm them.',
|
|
35667
35847
|
),
|
|
35668
35848
|
messageBox('Nothing changes yet', 'This first step only prepares the safe plan. You decide whether to apply it after seeing the concrete changes.'),
|
|
35669
35849
|
progress('Checking ' + agent.name, 'Reading installed optimizer versions and current integration state.'),
|
|
@@ -35689,13 +35869,18 @@ var init_guided_product_client = __esm({
|
|
|
35689
35869
|
.then(data => {
|
|
35690
35870
|
if (run !== modalRun || !$('modal').open) return;
|
|
35691
35871
|
pendingTicket = data.ticket;
|
|
35872
|
+
if (!data.ticket) {
|
|
35873
|
+
refreshOverviewAfterMutation('Refreshing setup availability after the review…').catch(
|
|
35874
|
+
() => undefined,
|
|
35875
|
+
);
|
|
35876
|
+
}
|
|
35692
35877
|
$('modal-content').replaceChildren();
|
|
35693
35878
|
$('modal-content').append(
|
|
35694
35879
|
messageBox(
|
|
35695
35880
|
provider ? 'This optimizer only' : 'Recommended setup',
|
|
35696
35881
|
provider
|
|
35697
35882
|
? 'This approval changes only ' + provider.name + ' for ' + agent.name + '. Other optimizers are left unchanged.'
|
|
35698
|
-
: 'This
|
|
35883
|
+
: 'This review includes only the currently actionable RTK/HarnessTrim changes for ' + agent.name + '. Unsupported or already-complete baseline providers are left out. Optional optimizers stay separate.',
|
|
35699
35884
|
),
|
|
35700
35885
|
);
|
|
35701
35886
|
if (!data.changes.length) {
|
|
@@ -35703,7 +35888,7 @@ var init_guided_product_client = __esm({
|
|
|
35703
35888
|
messageBox(
|
|
35704
35889
|
'No setup change available',
|
|
35705
35890
|
(data.notices || []).join(' ') ||
|
|
35706
|
-
'
|
|
35891
|
+
'No reviewed automatic change is available now. The dashboard is refreshing so an obsolete setup action is not left visible.',
|
|
35707
35892
|
),
|
|
35708
35893
|
);
|
|
35709
35894
|
} else {
|
|
@@ -37094,7 +37279,7 @@ ${GUIDE_CANDIDATE_READINESS_JS}`;
|
|
|
37094
37279
|
</div>
|
|
37095
37280
|
|
|
37096
37281
|
<section class="setup-step" id="coding-agents">
|
|
37097
|
-
<div class="section-title"><div><h2>Coding agents</h2><p>
|
|
37282
|
+
<div class="section-title"><div><h2>Coding agents</h2><p>Token Harness shows setup actions only when it has a reviewed automatic change for that exact agent, provider version and platform. Unsupported combinations are shown as unavailable instead of as unfinished work.</p></div></div>
|
|
37098
37283
|
<div id="setup-agents" class="tool-grid"><article class="tool-card"><h3>Checking agents\u2026</h3></article></div>
|
|
37099
37284
|
<details class="disclosure advanced-disclosure">
|
|
37100
37285
|
<summary>Agent details and optional reasoning settings</summary>
|