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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "token-harness",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "Quota-aware efficiency layer for Claude Code and Codex subscription limits.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
package/sbom.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.5",
4
- "serialNumber": "urn:uuid:8840bbd7-fcea-b78f-b033-a40bef562512",
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.14",
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": "8840bbd7fceab78fb033a40bef5625123772648c48cb4fea73b39020b714e9cf"
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.14";
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" && data["harness"] !== void 0) {
32758
- if (data["provider"] === void 0) {
32759
- setupProviders.push("rtk", "harnesstrim");
32760
- } else {
32761
- setupProviders.push(String(data["provider"]));
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. The integration may already be configured, or a required provider is not installed.")}`);
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 componentConfiguredFor(id, agentId) {
35362
- const component = managedComponent(id);
35363
- return Boolean(component?.configuredHarnesses?.includes(agentId));
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 baselineReadyFor(agentId) {
35367
- return componentConfiguredFor('rtk', agentId) && componentConfiguredFor('harnesstrim', agentId);
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 => !baselineReadyFor(agent.id));
35516
+ return activeAgents().filter(agent => baselineStatusFor(agent.id).state === 'incomplete');
35372
35517
  }
35373
35518
 
35374
- function providerSupportsAgent(providerId, agentId) {
35375
- if (providerId === 'gitnexus') return agentId === 'claude';
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: 'The recommended baseline is RTK + HarnessTrim. Finish setup on each incomplete coding-agent card below; you will see the exact safe plan before anything changes.',
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
- if (component.installed) return { label: 'Installed · not connected', cls: '' };
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
- : 'Not connected to a coding agent';
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
- if (!providerSupportsAgent(id, agent.id)) continue;
35571
- if (component?.configuredHarnesses?.includes(agent.id)) continue;
35572
- if (info.optional) {
35573
- actions.append(
35574
- actionButton(
35575
- 'Set up for ' + agent.name,
35576
- () => reviewSetup(agent.id, id),
35577
- 'secondary',
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 ready = baselineReadyFor(agent.id);
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(ready ? 'Ready' : 'Setup incomplete', ready ? 'good' : 'warn'));
35624
- card.append(
35625
- head,
35626
- node(
35627
- 'p',
35628
- ready
35629
- ? 'RTK + HarnessTrim are configured for this coding agent.'
35630
- : 'The agent is detected. Finish the recommended RTK + HarnessTrim setup to complete onboarding.',
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 (!ready) {
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 recommended RTK + HarnessTrim setup for ' + agent.name + '. The exact files and changes appear before you confirm them.',
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 approval covers only RTK + HarnessTrim for ' + agent.name + '. Optional optimizers stay separate.',
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
- 'This setup is already complete, or a prerequisite/version prevents Token Harness from changing it safely.',
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>These are the harnesses Token Harness can configure today. A detected agent is not considered fully set up until the recommended RTK + HarnessTrim baseline is connected to it.</p></div></div>
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>