@springbrand/cli 0.1.0
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/README.md +167 -0
- package/dist/commands/auth.d.ts +4 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +241 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/check-version.d.ts +3 -0
- package/dist/commands/check-version.d.ts.map +1 -0
- package/dist/commands/check-version.js +112 -0
- package/dist/commands/check-version.js.map +1 -0
- package/dist/commands/config-claude.d.ts +4 -0
- package/dist/commands/config-claude.d.ts.map +1 -0
- package/dist/commands/config-claude.js +78 -0
- package/dist/commands/config-claude.js.map +1 -0
- package/dist/commands/connect.d.ts +41 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +901 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +124 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/upgrade.d.ts +9 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +133 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-detect.d.ts +33 -0
- package/dist/lib/agent-detect.d.ts.map +1 -0
- package/dist/lib/agent-detect.js +81 -0
- package/dist/lib/agent-detect.js.map +1 -0
- package/dist/lib/agent-launcher.d.ts +22 -0
- package/dist/lib/agent-launcher.d.ts.map +1 -0
- package/dist/lib/agent-launcher.js +67 -0
- package/dist/lib/agent-launcher.js.map +1 -0
- package/dist/lib/auth.d.ts +90 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +327 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/bundled-skill.d.ts +5 -0
- package/dist/lib/bundled-skill.d.ts.map +1 -0
- package/dist/lib/bundled-skill.js +13 -0
- package/dist/lib/bundled-skill.js.map +1 -0
- package/dist/lib/claude-config.d.ts +19 -0
- package/dist/lib/claude-config.d.ts.map +1 -0
- package/dist/lib/claude-config.js +202 -0
- package/dist/lib/claude-config.js.map +1 -0
- package/dist/lib/cli-install.d.ts +40 -0
- package/dist/lib/cli-install.d.ts.map +1 -0
- package/dist/lib/cli-install.js +42 -0
- package/dist/lib/cli-install.js.map +1 -0
- package/dist/lib/command-code-config.d.ts +5 -0
- package/dist/lib/command-code-config.d.ts.map +1 -0
- package/dist/lib/command-code-config.js +16 -0
- package/dist/lib/command-code-config.js.map +1 -0
- package/dist/lib/connect-all-auth.d.ts +21 -0
- package/dist/lib/connect-all-auth.d.ts.map +1 -0
- package/dist/lib/connect-all-auth.js +113 -0
- package/dist/lib/connect-all-auth.js.map +1 -0
- package/dist/lib/connect-all-summary.d.ts +10 -0
- package/dist/lib/connect-all-summary.d.ts.map +1 -0
- package/dist/lib/connect-all-summary.js +153 -0
- package/dist/lib/connect-all-summary.js.map +1 -0
- package/dist/lib/connect-all-uninstall.d.ts +7 -0
- package/dist/lib/connect-all-uninstall.d.ts.map +1 -0
- package/dist/lib/connect-all-uninstall.js +249 -0
- package/dist/lib/connect-all-uninstall.js.map +1 -0
- package/dist/lib/connect-all.d.ts +42 -0
- package/dist/lib/connect-all.d.ts.map +1 -0
- package/dist/lib/connect-all.js +438 -0
- package/dist/lib/connect-all.js.map +1 -0
- package/dist/lib/connect-auth.d.ts +7 -0
- package/dist/lib/connect-auth.d.ts.map +1 -0
- package/dist/lib/connect-auth.js +50 -0
- package/dist/lib/connect-auth.js.map +1 -0
- package/dist/lib/connect-clients.d.ts +108 -0
- package/dist/lib/connect-clients.d.ts.map +1 -0
- package/dist/lib/connect-clients.js +358 -0
- package/dist/lib/connect-clients.js.map +1 -0
- package/dist/lib/connect-fallback.d.ts +27 -0
- package/dist/lib/connect-fallback.d.ts.map +1 -0
- package/dist/lib/connect-fallback.js +166 -0
- package/dist/lib/connect-fallback.js.map +1 -0
- package/dist/lib/connect-picker.d.ts +19 -0
- package/dist/lib/connect-picker.d.ts.map +1 -0
- package/dist/lib/connect-picker.js +155 -0
- package/dist/lib/connect-picker.js.map +1 -0
- package/dist/lib/connect-preflight.d.ts +17 -0
- package/dist/lib/connect-preflight.d.ts.map +1 -0
- package/dist/lib/connect-preflight.js +81 -0
- package/dist/lib/connect-preflight.js.map +1 -0
- package/dist/lib/connect-runtime.d.ts +109 -0
- package/dist/lib/connect-runtime.d.ts.map +1 -0
- package/dist/lib/connect-runtime.js +360 -0
- package/dist/lib/connect-runtime.js.map +1 -0
- package/dist/lib/constants.d.ts +23 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +87 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/cursor-config.d.ts +16 -0
- package/dist/lib/cursor-config.d.ts.map +1 -0
- package/dist/lib/cursor-config.js +34 -0
- package/dist/lib/cursor-config.js.map +1 -0
- package/dist/lib/doctor-checks.d.ts +21 -0
- package/dist/lib/doctor-checks.d.ts.map +1 -0
- package/dist/lib/doctor-checks.js +312 -0
- package/dist/lib/doctor-checks.js.map +1 -0
- package/dist/lib/doctor-repairs.d.ts +11 -0
- package/dist/lib/doctor-repairs.d.ts.map +1 -0
- package/dist/lib/doctor-repairs.js +130 -0
- package/dist/lib/doctor-repairs.js.map +1 -0
- package/dist/lib/doctor-report.d.ts +195 -0
- package/dist/lib/doctor-report.d.ts.map +1 -0
- package/dist/lib/doctor-report.js +102 -0
- package/dist/lib/doctor-report.js.map +1 -0
- package/dist/lib/doctor-telemetry.d.ts +9 -0
- package/dist/lib/doctor-telemetry.d.ts.map +1 -0
- package/dist/lib/doctor-telemetry.js +63 -0
- package/dist/lib/doctor-telemetry.js.map +1 -0
- package/dist/lib/harness-detect.d.ts +33 -0
- package/dist/lib/harness-detect.d.ts.map +1 -0
- package/dist/lib/harness-detect.js +70 -0
- package/dist/lib/harness-detect.js.map +1 -0
- package/dist/lib/harness-spec.d.ts +285 -0
- package/dist/lib/harness-spec.d.ts.map +1 -0
- package/dist/lib/harness-spec.js +268 -0
- package/dist/lib/harness-spec.js.map +1 -0
- package/dist/lib/harness.d.ts +27 -0
- package/dist/lib/harness.d.ts.map +1 -0
- package/dist/lib/harness.js +125 -0
- package/dist/lib/harness.js.map +1 -0
- package/dist/lib/hermes-config.d.ts +22 -0
- package/dist/lib/hermes-config.d.ts.map +1 -0
- package/dist/lib/hermes-config.js +76 -0
- package/dist/lib/hermes-config.js.map +1 -0
- package/dist/lib/hermes-env.d.ts +19 -0
- package/dist/lib/hermes-env.d.ts.map +1 -0
- package/dist/lib/hermes-env.js +169 -0
- package/dist/lib/hermes-env.js.map +1 -0
- package/dist/lib/hermes-plugin.d.ts +40 -0
- package/dist/lib/hermes-plugin.d.ts.map +1 -0
- package/dist/lib/hermes-plugin.js +168 -0
- package/dist/lib/hermes-plugin.js.map +1 -0
- package/dist/lib/install-root.d.ts +18 -0
- package/dist/lib/install-root.d.ts.map +1 -0
- package/dist/lib/install-root.js +55 -0
- package/dist/lib/install-root.js.map +1 -0
- package/dist/lib/mcp-config.d.ts +36 -0
- package/dist/lib/mcp-config.d.ts.map +1 -0
- package/dist/lib/mcp-config.js +90 -0
- package/dist/lib/mcp-config.js.map +1 -0
- package/dist/lib/mcp-endpoint.d.ts +16 -0
- package/dist/lib/mcp-endpoint.d.ts.map +1 -0
- package/dist/lib/mcp-endpoint.js +41 -0
- package/dist/lib/mcp-endpoint.js.map +1 -0
- package/dist/lib/mcp-json-config.d.ts +43 -0
- package/dist/lib/mcp-json-config.d.ts.map +1 -0
- package/dist/lib/mcp-json-config.js +164 -0
- package/dist/lib/mcp-json-config.js.map +1 -0
- package/dist/lib/notice.d.ts +13 -0
- package/dist/lib/notice.d.ts.map +1 -0
- package/dist/lib/notice.js +73 -0
- package/dist/lib/notice.js.map +1 -0
- package/dist/lib/omp-config.d.ts +18 -0
- package/dist/lib/omp-config.d.ts.map +1 -0
- package/dist/lib/omp-config.js +73 -0
- package/dist/lib/omp-config.js.map +1 -0
- package/dist/lib/output.d.ts +22 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +92 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/pi-config.d.ts +27 -0
- package/dist/lib/pi-config.d.ts.map +1 -0
- package/dist/lib/pi-config.js +113 -0
- package/dist/lib/pi-config.js.map +1 -0
- package/dist/lib/registration-detect.d.ts +28 -0
- package/dist/lib/registration-detect.d.ts.map +1 -0
- package/dist/lib/registration-detect.js +563 -0
- package/dist/lib/registration-detect.js.map +1 -0
- package/dist/lib/setup-telemetry.d.ts +273 -0
- package/dist/lib/setup-telemetry.d.ts.map +1 -0
- package/dist/lib/setup-telemetry.js +309 -0
- package/dist/lib/setup-telemetry.js.map +1 -0
- package/dist/lib/signals.d.ts +14 -0
- package/dist/lib/signals.d.ts.map +1 -0
- package/dist/lib/signals.js +29 -0
- package/dist/lib/signals.js.map +1 -0
- package/dist/lib/skill-install.d.ts +10 -0
- package/dist/lib/skill-install.d.ts.map +1 -0
- package/dist/lib/skill-install.js +94 -0
- package/dist/lib/skill-install.js.map +1 -0
- package/dist/lib/skill-paths.d.ts +7 -0
- package/dist/lib/skill-paths.d.ts.map +1 -0
- package/dist/lib/skill-paths.js +37 -0
- package/dist/lib/skill-paths.js.map +1 -0
- package/dist/lib/skill-vendor.d.ts +20 -0
- package/dist/lib/skill-vendor.d.ts.map +1 -0
- package/dist/lib/skill-vendor.js +215 -0
- package/dist/lib/skill-vendor.js.map +1 -0
- package/dist/lib/skill.d.ts +14 -0
- package/dist/lib/skill.d.ts.map +1 -0
- package/dist/lib/skill.js +87 -0
- package/dist/lib/skill.js.map +1 -0
- package/dist/lib/verify.d.ts +35 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +169 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/program.d.ts +8 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +54 -0
- package/dist/program.js.map +1 -0
- package/package.json +55 -0
- package/skill/springbrand-action-api/SKILL.md +49 -0
- package/skill/springbrand-action-api/references/action-aliases.md +156 -0
- package/skill/springbrand-action-api/references/action-discovery.md +95 -0
- package/skill/springbrand-connector/SKILL.md +49 -0
- package/skill/springbrand-gtm/SKILL.md +34 -0
- package/skill/springbrand-platform/SKILL.md +55 -0
- package/skill/springbrand-platform/references/plugin-discovery.md +94 -0
- package/skill/use-springbrand/SKILL.md +70 -0
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
/** 复刻自 tiny-fish CLI 编译产物:registration-detect.d.ts + registration-detect.impl.js */
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import spawn from 'cross-spawn';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { loadConfig, matchesCliKey } from './auth.js';
|
|
7
|
+
import { NATIVE_BY_HARNESS } from './connect-clients.js';
|
|
8
|
+
import { HARNESS_PROBE_TIMEOUT_MS } from './constants.js';
|
|
9
|
+
import { errLine } from './output.js';
|
|
10
|
+
import { readCommandCodeSpringbrandEntry } from './command-code-config.js';
|
|
11
|
+
import { readCursorSpringbrandEntry } from './cursor-config.js';
|
|
12
|
+
import { readOmpSpringbrandEntry } from './omp-config.js';
|
|
13
|
+
import { readPiSpringbrandEntry } from './pi-config.js';
|
|
14
|
+
import { readHermesKey, resolveHermesHome } from './hermes-env.js';
|
|
15
|
+
import { readHermesEntry } from './hermes-config.js';
|
|
16
|
+
import { detectInstalledHarnesses, harnessConfigPath, harnessDisplayPath, AuthMode, Registered, } from './harness-detect.js';
|
|
17
|
+
const NOT_REGISTERED = Object.freeze({
|
|
18
|
+
registered: Registered.No,
|
|
19
|
+
authMode: AuthMode.Unknown,
|
|
20
|
+
});
|
|
21
|
+
const unverified = (reason) => ({
|
|
22
|
+
registered: Registered.Unknown,
|
|
23
|
+
authMode: AuthMode.Unknown,
|
|
24
|
+
reason,
|
|
25
|
+
});
|
|
26
|
+
// A list, verified against codex 0.146. A name-keyed map was accepted here too, but every
|
|
27
|
+
// field is optional, so that arm parsed *any* object-of-objects: a wrapper like
|
|
28
|
+
// `{"servers": {...}}` decoded as one entry named `servers` and reported SpringBrand absent.
|
|
29
|
+
// Codex's wire values, verified against 0.146; anything else stays unknown.
|
|
30
|
+
var CodexAuthStatus;
|
|
31
|
+
(function (CodexAuthStatus) {
|
|
32
|
+
CodexAuthStatus["OAuth"] = "o_auth";
|
|
33
|
+
CodexAuthStatus["NotLoggedIn"] = "not_logged_in";
|
|
34
|
+
})(CodexAuthStatus || (CodexAuthStatus = {}));
|
|
35
|
+
const codexEntrySchema = z.looseObject({
|
|
36
|
+
name: z.string().optional(),
|
|
37
|
+
auth_status: z.string().optional(),
|
|
38
|
+
transport: z
|
|
39
|
+
.looseObject({ url: z.string().optional(), bearer_token_env_var: z.string().nullish() })
|
|
40
|
+
.optional(),
|
|
41
|
+
});
|
|
42
|
+
const codexListSchema = z.array(codexEntrySchema);
|
|
43
|
+
// An old harness CLI without the subcommand exits non-zero too; that is unknown, not absent.
|
|
44
|
+
const UNSUPPORTED_SUBCOMMAND = /unknown command|unrecognized subcommand|invalid subcommand/i;
|
|
45
|
+
// `claude mcp get` exits 1 for a usage error too, so only this message is evidence of absence.
|
|
46
|
+
const NO_SUCH_SERVER = /no (?:mcp )?server named/i;
|
|
47
|
+
// `Authorization: Bearer` is the only header the Gateway reads a key from. `x-api-key` is what
|
|
48
|
+
// CLIs before the switch wrote: still evidence of a keyed install, but a broken one.
|
|
49
|
+
const API_KEY_HEADER = /^\s*(?:Authorization|X-API-Key):/im;
|
|
50
|
+
const LEGACY_KEY_HEADER = /^\s*X-API-Key:/im;
|
|
51
|
+
// `claude mcp get` prints the value; `mcp add` masks it.
|
|
52
|
+
const API_KEY_HEADER_VALUE = /^\s*Authorization:\s*Bearer\s+(\S+)\s*$/im;
|
|
53
|
+
// OpenCode colours its list even through a pipe, putting `\x1b[34m` between the line start and
|
|
54
|
+
// the server name, so an unstripped probe reads a registered harness as absent.
|
|
55
|
+
// eslint-disable-next-line no-control-regex
|
|
56
|
+
const ANSI_SGR = /\x1b\[[0-9;]*m/g;
|
|
57
|
+
function spawnFailureReason(command, code) {
|
|
58
|
+
if (code === 'ENOENT')
|
|
59
|
+
return `\`${command}\` is not on PATH`;
|
|
60
|
+
if (code === 'EACCES')
|
|
61
|
+
return `\`${command}\` is not executable`;
|
|
62
|
+
return `could not run \`${command}\``;
|
|
63
|
+
}
|
|
64
|
+
function runProbe(command, args) {
|
|
65
|
+
const result = spawn.sync(command, args, {
|
|
66
|
+
encoding: 'utf8',
|
|
67
|
+
timeout: HARNESS_PROBE_TIMEOUT_MS,
|
|
68
|
+
// Belt and braces only: agents export FORCE_COLOR, and `NO_COLOR` does not fully silence
|
|
69
|
+
// OpenCode, so the strip below stays load-bearing rather than a fallback.
|
|
70
|
+
env: { ...process.env, NO_COLOR: '1', FORCE_COLOR: '0' },
|
|
71
|
+
});
|
|
72
|
+
if (result.error) {
|
|
73
|
+
const code = result.error.code;
|
|
74
|
+
// A timeout arrives as ETIMEDOUT here, not only as a signal, so it must be named before
|
|
75
|
+
// the generic spawn failure; otherwise a timeout reports "could not run".
|
|
76
|
+
if (code === 'ETIMEDOUT') {
|
|
77
|
+
return { outcome: 'unavailable', reason: `\`${command} ${args.join(' ')}\` timed out` };
|
|
78
|
+
}
|
|
79
|
+
return { outcome: 'unavailable', reason: spawnFailureReason(command, code) };
|
|
80
|
+
}
|
|
81
|
+
// Reached only when something else killed the child, so this is a crash, not the timeout.
|
|
82
|
+
if (result.signal) {
|
|
83
|
+
return { outcome: 'unavailable', reason: `\`${command}\` was killed by ${result.signal}` };
|
|
84
|
+
}
|
|
85
|
+
// Both streams, since a colour code inside a JSON payload breaks the parse just as it
|
|
86
|
+
// breaks an anchored match. Valid JSON never carries a raw ESC byte, so this cannot corrupt it.
|
|
87
|
+
const stdout = (result.stdout ?? '').replace(ANSI_SGR, '');
|
|
88
|
+
return {
|
|
89
|
+
outcome: 'ran',
|
|
90
|
+
exitCode: result.status ?? 1,
|
|
91
|
+
stdout,
|
|
92
|
+
output: `${stdout}${(result.stderr ?? '').replace(ANSI_SGR, '')}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Undefined when the probe ran and exited zero. */
|
|
96
|
+
function probeReason(command, args, probe) {
|
|
97
|
+
if (probe.outcome === 'unavailable')
|
|
98
|
+
return probe.reason;
|
|
99
|
+
if (probe.exitCode === 0)
|
|
100
|
+
return undefined;
|
|
101
|
+
return `\`${command} ${args.join(' ')}\` exited ${probe.exitCode}`;
|
|
102
|
+
}
|
|
103
|
+
// A plugin registers its server as `plugin:<plugin>:<server>`, which `mcp get springbrand` misses.
|
|
104
|
+
// The optional prefix must end in `:`, so `not-springbrand` is not a match.
|
|
105
|
+
const MCP_LIST_SPRINGBRAND_LINE = /^((?:\S*:)?springbrand):\s+(https?:\S+)(.*)$/m;
|
|
106
|
+
const SERVER_NAMED_SPRINGBRAND = /^(?:\S*:)?springbrand$/;
|
|
107
|
+
// A bare substring also matches `not-springbrand` and any row quoting a springbrand URL, so the name
|
|
108
|
+
// is required to be the first word on its line, after whatever status glyph the CLI prints.
|
|
109
|
+
const LISTED_AS_SPRINGBRAND = /^[^\w]*springbrand(?![\w-])/m;
|
|
110
|
+
// Claude Code reports its own live handshake; a config file cannot.
|
|
111
|
+
const MCP_GET_STATUS = /^\s*Status:\s*(.+)$/m;
|
|
112
|
+
// `mcp get <missing>` names every configured server, with no health check.
|
|
113
|
+
const CONFIGURED_SERVERS = /Configured servers:\s*(.+)$/m;
|
|
114
|
+
/** Ordered: "Connected · tools fetch failed" carries both words; the failure wins. */
|
|
115
|
+
function connectionState(status) {
|
|
116
|
+
if (/fail|error|needs auth|not configured/i.test(status))
|
|
117
|
+
return false;
|
|
118
|
+
if (/\bconnected\b/i.test(status))
|
|
119
|
+
return true;
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
/** The plugin ships its own MCP server, so a working install can carry no `springbrand` entry. */
|
|
123
|
+
function fromPluginRegistration(command) {
|
|
124
|
+
const probe = runProbe(command, ['mcp', 'list']);
|
|
125
|
+
if (probe.outcome === 'unavailable' || probe.exitCode !== 0)
|
|
126
|
+
return undefined;
|
|
127
|
+
const match = MCP_LIST_SPRINGBRAND_LINE.exec(probe.output);
|
|
128
|
+
if (!match)
|
|
129
|
+
return undefined;
|
|
130
|
+
const connected = connectionState(match[3] ?? '');
|
|
131
|
+
// `mcp list` prints no headers, so the credential behind it is unproven, never assumed.
|
|
132
|
+
return {
|
|
133
|
+
registered: Registered.Yes,
|
|
134
|
+
authMode: AuthMode.Unknown,
|
|
135
|
+
registeredUrl: match[2],
|
|
136
|
+
...(connected === undefined ? {} : { connected }),
|
|
137
|
+
reason: `registered as ${match[1]}`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Names can contain spaces, so each candidate is matched whole. */
|
|
141
|
+
function springbrandServerName(output) {
|
|
142
|
+
const listed = CONFIGURED_SERVERS.exec(output)?.[1];
|
|
143
|
+
return listed
|
|
144
|
+
?.split(',')
|
|
145
|
+
.map((name) => name.trim())
|
|
146
|
+
.find((name) => SERVER_NAMED_SPRINGBRAND.test(name));
|
|
147
|
+
}
|
|
148
|
+
function parseMcpGet(output) {
|
|
149
|
+
// Positive evidence only: whether `mcp get` echoes headers at all is unverified, so absence
|
|
150
|
+
// of the pattern is `unknown`, never proof of OAuth.
|
|
151
|
+
const url = /^\s*URL:\s*(\S+)/m.exec(output)?.[1];
|
|
152
|
+
const keyMatchesCliKey = matchesCliKey(API_KEY_HEADER_VALUE.exec(output)?.[1]);
|
|
153
|
+
const status = MCP_GET_STATUS.exec(output)?.[1];
|
|
154
|
+
const connected = status === undefined ? undefined : connectionState(status);
|
|
155
|
+
return {
|
|
156
|
+
registered: Registered.Yes,
|
|
157
|
+
authMode: API_KEY_HEADER.test(output) ? AuthMode.ApiKey : AuthMode.Unknown,
|
|
158
|
+
...(url ? { registeredUrl: url } : {}),
|
|
159
|
+
...(keyMatchesCliKey ? { keyMatchesCliKey } : {}),
|
|
160
|
+
...(LEGACY_KEY_HEADER.test(output) ? { keyReason: LEGACY_KEY_REASON } : {}),
|
|
161
|
+
...(connected === undefined ? {} : { connected }),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// claude-code only. Codex cannot use this: its `mcp get` exits 0 on a missing server.
|
|
165
|
+
function fromMcpGet(command) {
|
|
166
|
+
const probe = runProbe(command, ['mcp', 'get', 'springbrand']);
|
|
167
|
+
if (probe.outcome === 'unavailable') {
|
|
168
|
+
return unverified(probe.reason);
|
|
169
|
+
}
|
|
170
|
+
if (probe.exitCode !== 0) {
|
|
171
|
+
if (UNSUPPORTED_SUBCOMMAND.test(probe.output ?? '')) {
|
|
172
|
+
return unverified(`\`${command} mcp get\` is unsupported by this version`);
|
|
173
|
+
}
|
|
174
|
+
// The roster is free; `mcp list` health-checks every server.
|
|
175
|
+
const scoped = springbrandServerName(probe.output ?? '');
|
|
176
|
+
if (scoped) {
|
|
177
|
+
const rescoped = runProbe(command, ['mcp', 'get', scoped]);
|
|
178
|
+
if (rescoped.outcome === 'ran' && rescoped.exitCode === 0) {
|
|
179
|
+
return {
|
|
180
|
+
...parseMcpGet(rescoped.output),
|
|
181
|
+
reason: `registered as ${scoped}`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Positive evidence from `mcp list` outranks anything inferred from a failed `mcp get`.
|
|
186
|
+
const plugin = fromPluginRegistration(command);
|
|
187
|
+
if (plugin)
|
|
188
|
+
return plugin;
|
|
189
|
+
// A broken CLI also exits nonzero, and reading that as absence earns a spurious repair.
|
|
190
|
+
if (!NO_SUCH_SERVER.test(probe.output ?? '')) {
|
|
191
|
+
return unverified(`\`${command} mcp get\` failed without reporting the server as absent`);
|
|
192
|
+
}
|
|
193
|
+
return NOT_REGISTERED;
|
|
194
|
+
}
|
|
195
|
+
return parseMcpGet(probe.output ?? '');
|
|
196
|
+
}
|
|
197
|
+
// `codex mcp get <missing>` prints an error and exits 0, so presence must never be read from
|
|
198
|
+
// its exit code; `mcp list --json` is the only trustworthy read-back.
|
|
199
|
+
function readCodexEntry() {
|
|
200
|
+
const args = ['mcp', 'list', '--json'];
|
|
201
|
+
const probe = runProbe('codex', args);
|
|
202
|
+
if (probe.outcome === 'unavailable')
|
|
203
|
+
return { reason: probe.reason };
|
|
204
|
+
// Presence is never inferred from exit code 0, but a nonzero exit means the output cannot
|
|
205
|
+
// be trusted either — that is `unknown`, not "no server".
|
|
206
|
+
const failure = probeReason('codex', args, probe);
|
|
207
|
+
if (failure)
|
|
208
|
+
return { reason: failure };
|
|
209
|
+
let servers;
|
|
210
|
+
try {
|
|
211
|
+
// stdout only: an update banner on stderr would otherwise break the parse and report a
|
|
212
|
+
// healthy install as `unknown`.
|
|
213
|
+
servers = JSON.parse(probe.stdout ?? '');
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return { reason: '`codex mcp list --json` returned unparseable output' };
|
|
217
|
+
}
|
|
218
|
+
// A scalar or a wrapper object decodes fine and then silently reports "no server", which
|
|
219
|
+
// would suggest a spurious repair. Anything but a list is unknown.
|
|
220
|
+
const shape = codexListSchema.safeParse(servers);
|
|
221
|
+
if (!shape.success)
|
|
222
|
+
return { reason: '`codex mcp list --json` returned an unexpected shape' };
|
|
223
|
+
return { entry: shape.data.find((s) => s.name === 'springbrand') };
|
|
224
|
+
}
|
|
225
|
+
// `mcp add` exits 0 whether or not its inline OAuth finished, so `not_logged_in` is the only
|
|
226
|
+
// evidence of an abandoned sign-in; every other state, older Codex included, is unknown.
|
|
227
|
+
function codexOauthCompleted() {
|
|
228
|
+
const read = readCodexEntry();
|
|
229
|
+
if ('reason' in read)
|
|
230
|
+
return undefined;
|
|
231
|
+
const status = read.entry?.auth_status;
|
|
232
|
+
if (status === CodexAuthStatus.OAuth)
|
|
233
|
+
return true;
|
|
234
|
+
if (status === CodexAuthStatus.NotLoggedIn)
|
|
235
|
+
return false;
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
/** Per-harness sign-in probes; connect composes these rather than the descriptor carrying them. */
|
|
239
|
+
export const SIGN_IN_PROBES = {
|
|
240
|
+
codex: codexOauthCompleted,
|
|
241
|
+
};
|
|
242
|
+
// This reaches the pasted report, so its shape is checked first.
|
|
243
|
+
const ENV_VAR_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
244
|
+
/** Undefined unless the descriptor routes this harness's key through a variable. */
|
|
245
|
+
function declaredKeyEnvVar(harness) {
|
|
246
|
+
return NATIVE_BY_HARNESS.get(harness)?.keyAuth?.envVar;
|
|
247
|
+
}
|
|
248
|
+
/** Codex stores a variable name; resolving it only answers whether it is the CLI's key. */
|
|
249
|
+
function envKeyVerdict(envVar) {
|
|
250
|
+
if (!ENV_VAR_NAME.test(envVar)) {
|
|
251
|
+
return { keyReason: 'its key comes from an unusable variable name' };
|
|
252
|
+
}
|
|
253
|
+
if (matchesCliKey(process.env[envVar]))
|
|
254
|
+
return { keyMatchesCliKey: true };
|
|
255
|
+
return {
|
|
256
|
+
keyReason: process.env[envVar]
|
|
257
|
+
? `$${envVar} holds a key this CLI cannot verify`
|
|
258
|
+
: `$${envVar} is not set here`,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function probeCodex() {
|
|
262
|
+
const read = readCodexEntry();
|
|
263
|
+
if ('reason' in read)
|
|
264
|
+
return unverified(read.reason ?? 'could not read codex registration');
|
|
265
|
+
const entry = read.entry;
|
|
266
|
+
if (!entry)
|
|
267
|
+
return NOT_REGISTERED;
|
|
268
|
+
const codexUrl = entry.transport?.url;
|
|
269
|
+
// Read from this entry: codex emits `bearer_token_env_var` on every HTTP server, so testing
|
|
270
|
+
// the whole payload reports api-key for SpringBrand because some other server carries a key.
|
|
271
|
+
const envVar = entry.auth_status === CodexAuthStatus.OAuth ? undefined : entry.transport?.bearer_token_env_var;
|
|
272
|
+
return {
|
|
273
|
+
registered: Registered.Yes,
|
|
274
|
+
authMode: entry.auth_status === CodexAuthStatus.OAuth
|
|
275
|
+
? AuthMode.OAuth
|
|
276
|
+
: envVar
|
|
277
|
+
? AuthMode.ApiKey
|
|
278
|
+
: AuthMode.Unknown,
|
|
279
|
+
// Codex's own verdict: a stale `oauth_resource` strands installs here.
|
|
280
|
+
...(entry.auth_status === CodexAuthStatus.NotLoggedIn && !envVar ? { connected: false } : {}),
|
|
281
|
+
...(codexUrl ? { registeredUrl: codexUrl } : {}),
|
|
282
|
+
...(envVar ? envKeyVerdict(envVar) : {}),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
const LEGACY_KEY_REASON = 'its key rides the X-API-Key header, which SpringBrand does not read';
|
|
286
|
+
/**
|
|
287
|
+
* Legacy outranks a key match: the CLI's own key verifies fine and is still not being sent
|
|
288
|
+
* where `/mcp` reads it, so claiming a verified reach off that match would be wrong.
|
|
289
|
+
*/
|
|
290
|
+
function keyVerdictFor(entry) {
|
|
291
|
+
if (entry.legacyKeyHeader)
|
|
292
|
+
return { keyReason: LEGACY_KEY_REASON };
|
|
293
|
+
// A hand-written `${VAR}` header resolves like Codex's env-var key.
|
|
294
|
+
if (entry.keyTemplateVar)
|
|
295
|
+
return envKeyVerdict(entry.keyTemplateVar);
|
|
296
|
+
return entry.keyMatchesCliKey ? { keyMatchesCliKey: true } : {};
|
|
297
|
+
}
|
|
298
|
+
function probeCommandCode() {
|
|
299
|
+
const entry = readCommandCodeSpringbrandEntry();
|
|
300
|
+
if (entry.error)
|
|
301
|
+
return unverified('mcp.json exists but could not be read or parsed');
|
|
302
|
+
if (!entry.present)
|
|
303
|
+
return NOT_REGISTERED;
|
|
304
|
+
// The /mcp toggle disables an entry in place, and Command Code then ignores it.
|
|
305
|
+
return {
|
|
306
|
+
registered: Registered.Yes,
|
|
307
|
+
authMode: entry.hasApiKeyHeader ? AuthMode.ApiKey : AuthMode.Unknown,
|
|
308
|
+
// connect only ever writes a keyed entry here, so a headerless one was not written by us.
|
|
309
|
+
...(entry.enabled === false ? { connected: false } : {}),
|
|
310
|
+
...(entry.url ? { registeredUrl: entry.url } : {}),
|
|
311
|
+
...keyVerdictFor(entry),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function probeCursor() {
|
|
315
|
+
const entry = readCursorSpringbrandEntry();
|
|
316
|
+
if (entry.error) {
|
|
317
|
+
return unverified('mcp.json exists but could not be read or parsed');
|
|
318
|
+
}
|
|
319
|
+
if (!entry.present)
|
|
320
|
+
return NOT_REGISTERED;
|
|
321
|
+
return {
|
|
322
|
+
registered: Registered.Yes,
|
|
323
|
+
authMode: entry.hasApiKeyHeader ? AuthMode.ApiKey : AuthMode.Unknown,
|
|
324
|
+
...(entry.url ? { registeredUrl: entry.url } : {}),
|
|
325
|
+
...keyVerdictFor(entry),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
// omp shares Cursor's mcp.json shape; only `omp config path` resolves it.
|
|
329
|
+
function probeOmp() {
|
|
330
|
+
const entry = readOmpSpringbrandEntry();
|
|
331
|
+
if (!entry) {
|
|
332
|
+
return unverified('`omp config path` did not report a config directory');
|
|
333
|
+
}
|
|
334
|
+
if (entry.error) {
|
|
335
|
+
return unverified('mcp.json exists but could not be read or parsed');
|
|
336
|
+
}
|
|
337
|
+
if (!entry.present)
|
|
338
|
+
return NOT_REGISTERED;
|
|
339
|
+
return {
|
|
340
|
+
registered: Registered.Yes,
|
|
341
|
+
authMode: entry.hasApiKeyHeader ? AuthMode.ApiKey : AuthMode.Unknown,
|
|
342
|
+
...(entry.url ? { registeredUrl: entry.url } : {}),
|
|
343
|
+
...keyVerdictFor(entry),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
// Whether anything reads the entry is the pi-adapter check's question, not this one.
|
|
347
|
+
function probePi() {
|
|
348
|
+
const entry = readPiSpringbrandEntry();
|
|
349
|
+
if (entry.error) {
|
|
350
|
+
return {
|
|
351
|
+
registered: Registered.Unknown,
|
|
352
|
+
authMode: AuthMode.Unknown,
|
|
353
|
+
reason: 'mcp.json exists but could not be read or parsed',
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
if (!entry.present)
|
|
357
|
+
return { registered: Registered.No, authMode: AuthMode.Unknown };
|
|
358
|
+
return {
|
|
359
|
+
registered: Registered.Yes,
|
|
360
|
+
authMode: entry.hasApiKeyHeader ? AuthMode.ApiKey : AuthMode.Unknown,
|
|
361
|
+
...(entry.url ? { registeredUrl: entry.url } : {}),
|
|
362
|
+
...keyVerdictFor(entry),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
// Both list commands print this header in every state, including "no servers configured".
|
|
366
|
+
// Exit 0 with output we cannot recognise is not evidence of absence: reporting `no` there would
|
|
367
|
+
// earn a connect repair off a parse failure, which is the bug class this command exists to kill.
|
|
368
|
+
const MCP_LIST_HEADER = /mcp servers/i;
|
|
369
|
+
// OpenCode prints the endpoint on the line under the server row; Hermes truncates its column.
|
|
370
|
+
const OPENCODE_ROW_URL = /^[^\w]*springbrand(?![\w-]).*\n[^\w]*(https?:\S+)/m;
|
|
371
|
+
function fromMcpList(command, output, registeredMode, urlPattern) {
|
|
372
|
+
if (LISTED_AS_SPRINGBRAND.test(output)) {
|
|
373
|
+
const url = urlPattern?.exec(output)?.[1];
|
|
374
|
+
return {
|
|
375
|
+
registered: Registered.Yes,
|
|
376
|
+
authMode: registeredMode,
|
|
377
|
+
...(url ? { registeredUrl: url } : {}),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
if (!MCP_LIST_HEADER.test(output)) {
|
|
381
|
+
return unverified(`could not interpret \`${command} mcp list\` output`);
|
|
382
|
+
}
|
|
383
|
+
return NOT_REGISTERED;
|
|
384
|
+
}
|
|
385
|
+
// `hermes mcp list` only pretty-prints this file, so connect's gate reads it too.
|
|
386
|
+
function probeHermes() {
|
|
387
|
+
const resolved = resolveHermesHome();
|
|
388
|
+
if (typeof resolved !== 'string') {
|
|
389
|
+
return unverified('`hermes dump` did not report a home directory');
|
|
390
|
+
}
|
|
391
|
+
const home = resolved;
|
|
392
|
+
const entry = readHermesEntry(home);
|
|
393
|
+
if (entry.state === 'unreadable' || entry.state === 'unparseable') {
|
|
394
|
+
return unverified(`Hermes' config.yaml could not be ${entry.state === 'unreadable' ? 'read' : 'parsed'}`);
|
|
395
|
+
}
|
|
396
|
+
if (entry.state === 'absent')
|
|
397
|
+
return NOT_REGISTERED;
|
|
398
|
+
// `mcp add` saves a disabled entry on a failed connect, which connect refuses too.
|
|
399
|
+
const enabled = entry.state === 'enabled' ? {} : { connected: false };
|
|
400
|
+
// The .env key is Hermes-wide; the header template ties it here.
|
|
401
|
+
const storedKey = entry.usesKeyHeader ? readHermesKey(home) : undefined;
|
|
402
|
+
if (!storedKey) {
|
|
403
|
+
return { registered: Registered.Yes, authMode: AuthMode.OAuth, ...enabled };
|
|
404
|
+
}
|
|
405
|
+
return {
|
|
406
|
+
registered: Registered.Yes,
|
|
407
|
+
authMode: AuthMode.ApiKey,
|
|
408
|
+
...enabled,
|
|
409
|
+
...(matchesCliKey(storedKey) ? { keyMatchesCliKey: true } : {}),
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
const SKILL_DIR_IS_SPRINGBRAND = /^(?:@springbrand[/_-])?springbrand(?![\w-])/i;
|
|
413
|
+
// OpenClaw installs a skill, not an MCP server; the skill shells the CLI, so auth is the CLI key.
|
|
414
|
+
function probeOpenClaw() {
|
|
415
|
+
const skillsDir = path.join(harnessConfigPath('openclaw'), 'skills');
|
|
416
|
+
let entries;
|
|
417
|
+
try {
|
|
418
|
+
entries = fs.readdirSync(skillsDir);
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
return unverified(`no global skills directory at ${harnessDisplayPath('openclaw')}/skills; OpenClaw layout is unverified`);
|
|
422
|
+
}
|
|
423
|
+
// A bare substring also matched a skill merely named `not-springbrand-thing`.
|
|
424
|
+
return entries.some((name) => SKILL_DIR_IS_SPRINGBRAND.test(name))
|
|
425
|
+
? { registered: Registered.Yes, authMode: AuthMode.ApiKey, usesCliKey: true }
|
|
426
|
+
: NOT_REGISTERED;
|
|
427
|
+
}
|
|
428
|
+
// `opencode mcp list` prints no headers, so a key-authed registration is indistinguishable.
|
|
429
|
+
function probeOpencode() {
|
|
430
|
+
const args = ['mcp', 'list'];
|
|
431
|
+
const probe = runProbe('opencode', args);
|
|
432
|
+
if (probe.outcome !== 'ran' || probe.exitCode !== 0) {
|
|
433
|
+
const reason = probeReason('opencode', args, probe);
|
|
434
|
+
return unverified(reason ?? 'could not run opencode mcp list');
|
|
435
|
+
}
|
|
436
|
+
return fromMcpList('opencode', probe.output, AuthMode.Unknown, OPENCODE_ROW_URL);
|
|
437
|
+
}
|
|
438
|
+
// Verified against grok 0.0.60: a list. Header values stay `unknown`; only names are read.
|
|
439
|
+
const grokEntrySchema = z.looseObject({
|
|
440
|
+
name: z.string().optional(),
|
|
441
|
+
url: z.string().optional(),
|
|
442
|
+
headers: z.record(z.string(), z.unknown()).optional(),
|
|
443
|
+
});
|
|
444
|
+
const grokListSchema = z.array(grokEntrySchema);
|
|
445
|
+
// grok 0.0.60 reports `installed` whether a plugin is enabled or disabled.
|
|
446
|
+
const grokPluginSchema = z.array(z.looseObject({ name: z.string().optional() }));
|
|
447
|
+
/** The Grok plugin ships its own MCP server, and `grok mcp list` does not show it. */
|
|
448
|
+
function fromGrokPlugin() {
|
|
449
|
+
const probe = runProbe('grok', ['plugin', 'list', '--json']);
|
|
450
|
+
if (probe.outcome === 'unavailable' || probe.exitCode !== 0)
|
|
451
|
+
return undefined;
|
|
452
|
+
let listed;
|
|
453
|
+
try {
|
|
454
|
+
listed = JSON.parse(probe.stdout);
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
// A build ignoring `--json` prints prose, which is no evidence either way.
|
|
458
|
+
return undefined;
|
|
459
|
+
}
|
|
460
|
+
// A future wrapper shape decodes fine and then reports "no plugin", which earns a `connect`
|
|
461
|
+
// repair that double-registers a working one. Anything but a list is unknown, not absent.
|
|
462
|
+
const shape = grokPluginSchema.safeParse(listed);
|
|
463
|
+
if (!shape.success) {
|
|
464
|
+
return unverified('`grok plugin list --json` returned an unexpected shape');
|
|
465
|
+
}
|
|
466
|
+
if (!shape.data.some((plugin) => plugin.name === 'springbrand'))
|
|
467
|
+
return undefined;
|
|
468
|
+
// The plugin manifest carries no headers, so its only credential path is the browser sign-in.
|
|
469
|
+
return {
|
|
470
|
+
registered: Registered.Yes,
|
|
471
|
+
authMode: AuthMode.OAuth,
|
|
472
|
+
reason: 'registered by the SpringBrand Grok plugin',
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
// Grok inherits our env, so a header we wrote round-trips to our own value.
|
|
476
|
+
function grokWroteIt(value, declared) {
|
|
477
|
+
const ours = process.env[declared];
|
|
478
|
+
return ours ? value === `Bearer ${ours}` : value === `Bearer \${${declared}}`;
|
|
479
|
+
}
|
|
480
|
+
/** The descriptor names the variable; envKeyVerdict owns every wording for it. */
|
|
481
|
+
function grokKeyAuth(headers) {
|
|
482
|
+
const authorization = Object.entries(headers).find(([name]) => name.toLowerCase() === 'authorization');
|
|
483
|
+
if (!authorization)
|
|
484
|
+
return { authMode: AuthMode.OAuth };
|
|
485
|
+
const declared = declaredKeyEnvVar('grok');
|
|
486
|
+
const value = typeof authorization[1] === 'string' ? authorization[1] : '';
|
|
487
|
+
if (!declared || !grokWroteIt(value, declared)) {
|
|
488
|
+
return { authMode: AuthMode.ApiKey, keyReason: 'it holds a key this CLI cannot verify' };
|
|
489
|
+
}
|
|
490
|
+
return { authMode: AuthMode.ApiKey, ...envKeyVerdict(declared) };
|
|
491
|
+
}
|
|
492
|
+
// Grok has no `mcp get`; `mcp list --json` is the only machine-readable view.
|
|
493
|
+
function probeGrok() {
|
|
494
|
+
const args = ['mcp', 'list', '--json'];
|
|
495
|
+
const probe = runProbe('grok', args);
|
|
496
|
+
if (probe.outcome === 'unavailable') {
|
|
497
|
+
return unverified(probe.reason);
|
|
498
|
+
}
|
|
499
|
+
if (probe.exitCode !== 0) {
|
|
500
|
+
if (UNSUPPORTED_SUBCOMMAND.test(probe.output ?? '')) {
|
|
501
|
+
return unverified('this Grok build has no `mcp list --json`');
|
|
502
|
+
}
|
|
503
|
+
return unverified(probeReason('grok', args, probe) ?? 'grok mcp list failed');
|
|
504
|
+
}
|
|
505
|
+
let entries;
|
|
506
|
+
try {
|
|
507
|
+
entries = grokListSchema.parse(JSON.parse(probe.stdout));
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
return unverified('`grok mcp list --json` did not return the expected shape');
|
|
511
|
+
}
|
|
512
|
+
const entry = entries.find((server) => server.name === 'springbrand');
|
|
513
|
+
if (!entry)
|
|
514
|
+
return fromGrokPlugin() ?? NOT_REGISTERED;
|
|
515
|
+
return {
|
|
516
|
+
registered: Registered.Yes,
|
|
517
|
+
...grokKeyAuth(entry.headers ?? {}),
|
|
518
|
+
...(entry.url ? { registeredUrl: entry.url } : {}),
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
const PROBES = {
|
|
522
|
+
'claude-code': () => fromMcpGet('claude'),
|
|
523
|
+
codex: probeCodex,
|
|
524
|
+
'command-code': probeCommandCode,
|
|
525
|
+
cursor: probeCursor,
|
|
526
|
+
grok: probeGrok,
|
|
527
|
+
hermes: probeHermes,
|
|
528
|
+
omp: probeOmp,
|
|
529
|
+
openclaw: probeOpenClaw,
|
|
530
|
+
opencode: probeOpencode,
|
|
531
|
+
pi: probePi,
|
|
532
|
+
};
|
|
533
|
+
/** Never throws; a failed probe is `unknown` with a reason, so no caller can read it as healthy. */
|
|
534
|
+
export function detectRegistrations(harnesses) {
|
|
535
|
+
const connect = loadConfig().connect ?? {};
|
|
536
|
+
return detectInstalledHarnesses()
|
|
537
|
+
.filter((detection) => !harnesses || harnesses.includes(detection.harness))
|
|
538
|
+
.map((detection) => {
|
|
539
|
+
const recordedAuthMode = connect[detection.harness]?.auth_mode;
|
|
540
|
+
const base = {
|
|
541
|
+
harness: detection.harness,
|
|
542
|
+
detected: detection.detected,
|
|
543
|
+
connectedBefore: detection.harness in connect,
|
|
544
|
+
...(recordedAuthMode ? { recordedAuthMode } : {}),
|
|
545
|
+
};
|
|
546
|
+
// Undetected means nothing to probe: no spawn cost, and no misleading "unknown".
|
|
547
|
+
if (!detection.detected) {
|
|
548
|
+
return { ...base, registered: Registered.No, authMode: AuthMode.Unknown };
|
|
549
|
+
}
|
|
550
|
+
try {
|
|
551
|
+
return { ...base, ...PROBES[detection.harness]() };
|
|
552
|
+
}
|
|
553
|
+
catch (e) {
|
|
554
|
+
// An arbitrary throw is the one message we cannot author, so it never ships. Full
|
|
555
|
+
// fidelity stays on stderr behind --debug, which is not the pasted artifact.
|
|
556
|
+
if (process.env['SPRINGBRAND_DEBUG']) {
|
|
557
|
+
errLine(`probe ${detection.harness} threw: ${e instanceof Error ? e.message : String(e)}`);
|
|
558
|
+
}
|
|
559
|
+
return { ...base, ...unverified('the probe failed unexpectedly') };
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=registration-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-detect.js","sourceRoot":"","sources":["../../src/lib/registration-detect.ts"],"names":[],"mappings":"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"}
|