@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,155 @@
|
|
|
1
|
+
/** 复刻自 tiny-fish CLI 编译产物:connect-picker.d.ts + connect-picker.impl.js */
|
|
2
|
+
import * as readline from 'node:readline';
|
|
3
|
+
import { HARNESS_DISPLAY_NAMES } from './harness-detect.js';
|
|
4
|
+
const KEY_HELP = ' ↑↓ move space toggle one a none/all q cancel';
|
|
5
|
+
function header(count) {
|
|
6
|
+
return `Found ${count} agent config${count === 1 ? '' : 's'} on this machine.\n\n`;
|
|
7
|
+
}
|
|
8
|
+
function connectedNote(item) {
|
|
9
|
+
return item.connectedBefore ? ' (previously connected)' : '';
|
|
10
|
+
}
|
|
11
|
+
function enterHint(checkedCount, total) {
|
|
12
|
+
if (checkedCount === 0)
|
|
13
|
+
return 'press enter to cancel';
|
|
14
|
+
if (checkedCount === total)
|
|
15
|
+
return `press enter to connect all ${total}`;
|
|
16
|
+
return `press enter to connect ${checkedCount} of ${total}`;
|
|
17
|
+
}
|
|
18
|
+
function frame(items, checked, cursor) {
|
|
19
|
+
const rows = items.map((item, i) => ` ${i === cursor ? '>' : ' '} [${checked[i] ? 'x' : ' '}] ${item.name}${connectedNote(item)}`);
|
|
20
|
+
const count = checked.filter(Boolean).length;
|
|
21
|
+
return [...rows, '', ` ${enterHint(count, items.length)}`, KEY_HELP, ''].join('\n');
|
|
22
|
+
}
|
|
23
|
+
function keyCommand(key) {
|
|
24
|
+
const name = key.name ?? '';
|
|
25
|
+
// Raw mode eats terminal SIGINT, so Ctrl+C arrives only here.
|
|
26
|
+
if ((key.ctrl && (name === 'c' || name === 'd')) || name === 'q' || name === 'escape') {
|
|
27
|
+
return 'cancel';
|
|
28
|
+
}
|
|
29
|
+
if (name === 'return' || name === 'enter')
|
|
30
|
+
return 'submit';
|
|
31
|
+
if (name === 'up' || name === 'k')
|
|
32
|
+
return 'up';
|
|
33
|
+
if (name === 'down' || name === 'j')
|
|
34
|
+
return 'down';
|
|
35
|
+
if (name === 'space')
|
|
36
|
+
return 'toggle';
|
|
37
|
+
if (name === 'a')
|
|
38
|
+
return 'toggle-all';
|
|
39
|
+
return 'none';
|
|
40
|
+
}
|
|
41
|
+
async function pickWithKeys(items, stdin, write) {
|
|
42
|
+
const checked = items.map(() => true);
|
|
43
|
+
let cursor = 0;
|
|
44
|
+
let painted = 0;
|
|
45
|
+
const paint = () => {
|
|
46
|
+
const text = frame(items, checked, cursor);
|
|
47
|
+
write((painted > 0 ? `\u001b[${painted}A\u001b[0J` : '') + text);
|
|
48
|
+
painted = items.length + 3;
|
|
49
|
+
};
|
|
50
|
+
readline.emitKeypressEvents(stdin);
|
|
51
|
+
stdin.setRawMode?.(true);
|
|
52
|
+
stdin.resume();
|
|
53
|
+
let onKeypress;
|
|
54
|
+
try {
|
|
55
|
+
write(header(items.length));
|
|
56
|
+
paint();
|
|
57
|
+
return await new Promise((resolve, reject) => {
|
|
58
|
+
onKeypress = (_chunk, key = {}) => {
|
|
59
|
+
try {
|
|
60
|
+
const command = keyCommand(key);
|
|
61
|
+
if (command === 'cancel') {
|
|
62
|
+
resolve('cancel');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (command === 'submit') {
|
|
66
|
+
const picked = items.filter((_, i) => checked[i]).map((item) => item.harness);
|
|
67
|
+
resolve(picked.length > 0 ? picked : 'cancel');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (command === 'up')
|
|
71
|
+
cursor = (cursor + items.length - 1) % items.length;
|
|
72
|
+
else if (command === 'down')
|
|
73
|
+
cursor = (cursor + 1) % items.length;
|
|
74
|
+
else if (command === 'toggle')
|
|
75
|
+
checked[cursor] = !checked[cursor];
|
|
76
|
+
else if (command === 'toggle-all')
|
|
77
|
+
checked.fill(!checked.every(Boolean));
|
|
78
|
+
paint();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
stdin.on('keypress', onKeypress);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
// Restore before any child spawn can inherit raw stdin (PF-3635).
|
|
89
|
+
if (onKeypress)
|
|
90
|
+
stdin.removeListener('keypress', onKeypress);
|
|
91
|
+
stdin.setRawMode?.(false);
|
|
92
|
+
stdin.pause();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function numberedRows(items) {
|
|
96
|
+
return (items.map((item, i) => ` [${i + 1}] ${item.name}${connectedNote(item)}`).join('\n') + '\n');
|
|
97
|
+
}
|
|
98
|
+
function parseSubset(answer, items) {
|
|
99
|
+
const tokens = answer.split(/[\s,]+/).filter(Boolean);
|
|
100
|
+
if (tokens.length === 0)
|
|
101
|
+
return undefined;
|
|
102
|
+
const picked = new Set();
|
|
103
|
+
for (const token of tokens) {
|
|
104
|
+
if (!/^\d+$/.test(token))
|
|
105
|
+
return undefined;
|
|
106
|
+
const index = Number.parseInt(token, 10);
|
|
107
|
+
if (index < 1 || index > items.length)
|
|
108
|
+
return undefined;
|
|
109
|
+
picked.add(index - 1);
|
|
110
|
+
}
|
|
111
|
+
return items.filter((_, i) => picked.has(i)).map((item) => item.harness);
|
|
112
|
+
}
|
|
113
|
+
async function pickWithNumbers(items, prompt, write) {
|
|
114
|
+
write(header(items.length) + numberedRows(items));
|
|
115
|
+
const question = `Press enter to connect all ${items.length}, numbers for a subset (e.g. 1,3), or n to cancel: `;
|
|
116
|
+
// One re-prompt on garbage, then cancel; never a loop.
|
|
117
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
118
|
+
let answer;
|
|
119
|
+
try {
|
|
120
|
+
answer = (await prompt(question)).trim();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Closed stdin: every later question would throw too.
|
|
124
|
+
return 'cancel';
|
|
125
|
+
}
|
|
126
|
+
if (answer === '')
|
|
127
|
+
return items.map((item) => item.harness);
|
|
128
|
+
if (/^[nq]$/i.test(answer))
|
|
129
|
+
return 'cancel';
|
|
130
|
+
const subset = parseSubset(answer, items);
|
|
131
|
+
if (subset)
|
|
132
|
+
return subset;
|
|
133
|
+
}
|
|
134
|
+
return 'cancel';
|
|
135
|
+
}
|
|
136
|
+
export async function pickHarnesses(detections, connectedBefore, io) {
|
|
137
|
+
const items = detections
|
|
138
|
+
.filter((detection) => detection.detected)
|
|
139
|
+
.map((detection) => ({
|
|
140
|
+
harness: detection.harness,
|
|
141
|
+
name: HARNESS_DISPLAY_NAMES[detection.harness],
|
|
142
|
+
connectedBefore: connectedBefore.has(detection.harness),
|
|
143
|
+
}));
|
|
144
|
+
const stdin = io?.stdin ?? process.stdin;
|
|
145
|
+
const write = io?.write ?? ((text) => void process.stderr.write(text));
|
|
146
|
+
if (typeof stdin.setRawMode !== 'function') {
|
|
147
|
+
// No prompt means nothing to ask; keep --all semantics.
|
|
148
|
+
const selection = io?.prompt
|
|
149
|
+
? await pickWithNumbers(items, io.prompt, write)
|
|
150
|
+
: items.map((item) => item.harness);
|
|
151
|
+
return { selection, mode: 'pick_numeric' };
|
|
152
|
+
}
|
|
153
|
+
return { selection: await pickWithKeys(items, stdin, write), mode: 'pick' };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=connect-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-picker.js","sourceRoot":"","sources":["../../src/lib/connect-picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** 复刻自 tiny-fish CLI 编译产物:connect-preflight.d.ts + connect-preflight.impl.js */
|
|
2
|
+
import type { SetupBlockedMode } from './setup-telemetry.js';
|
|
3
|
+
/**
|
|
4
|
+
* Checks the key every harness would install with, once, before anything is written.
|
|
5
|
+
* A bad key otherwise fails all seven installs the slow way, and Hermes refuses outright.
|
|
6
|
+
*/
|
|
7
|
+
export declare function gateApiKey(options: PreflightOptions): Promise<PreflightOutcome>;
|
|
8
|
+
export type PreflightOutcome = 'ok' | 'blocked';
|
|
9
|
+
interface PreflightOptions {
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
mcpUrl: string;
|
|
12
|
+
retryCommand: string;
|
|
13
|
+
mode: SetupBlockedMode;
|
|
14
|
+
attemptId?: string;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=connect-preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-preflight.d.ts","sourceRoot":"","sources":["../../src/lib/connect-preflight.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAmC/E;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6CrF;AAGD,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD,UAAU,gBAAgB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** 复刻自 tiny-fish CLI 编译产物:connect-preflight.d.ts + connect-preflight.impl.js */
|
|
2
|
+
import { KEY_FORMAT_HINT, apiKeyStatus, configFile, parseKeyIdentity, validateKeyFormat } from './auth.js';
|
|
3
|
+
import { SPRINGBRAND_API_KEY_VAR } from './constants.js';
|
|
4
|
+
import { apiBaseFromMcpUrl, endpointOf, environmentOf } from './mcp-endpoint.js';
|
|
5
|
+
import { errLine, warnLine } from './output.js';
|
|
6
|
+
import { sendSetupBlocked, } from './setup-telemetry.js';
|
|
7
|
+
import { verifyMcpAuth } from './verify.js';
|
|
8
|
+
function sourceAdvice(source) {
|
|
9
|
+
switch (source) {
|
|
10
|
+
case 'env':
|
|
11
|
+
return `The key came from ${SPRINGBRAND_API_KEY_VAR}, which overrides a saved key — fix or unset that export.`;
|
|
12
|
+
case 'explicit':
|
|
13
|
+
return 'The key came from --api-key.';
|
|
14
|
+
default:
|
|
15
|
+
return `The key came from ${configFile()}. Save a working one: sp auth login, or pipe a key to sp auth set.`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function block(detail, options) {
|
|
19
|
+
errLine(`${detail.message} Nothing was installed.`);
|
|
20
|
+
errLine(sourceAdvice(detail.source));
|
|
21
|
+
errLine(`Then re-run: ${options.retryCommand}`);
|
|
22
|
+
await sendSetupBlocked(options.mcpUrl, {
|
|
23
|
+
blockReason: detail.reason,
|
|
24
|
+
keySource: detail.source,
|
|
25
|
+
...(detail.status === undefined ? {} : { status: detail.status }),
|
|
26
|
+
mode: options.mode,
|
|
27
|
+
attemptId: options.attemptId,
|
|
28
|
+
});
|
|
29
|
+
return 'blocked';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Checks the key every harness would install with, once, before anything is written.
|
|
33
|
+
* A bad key otherwise fails all seven installs the slow way, and Hermes refuses outright.
|
|
34
|
+
*/
|
|
35
|
+
export async function gateApiKey(options) {
|
|
36
|
+
const status = apiKeyStatus(options.apiKey);
|
|
37
|
+
// No key at all is a valid answer: the OAuth harnesses still connect without one.
|
|
38
|
+
if (status.source === 'none')
|
|
39
|
+
return 'ok';
|
|
40
|
+
const source = status.source;
|
|
41
|
+
if (!('key' in status)) {
|
|
42
|
+
return block({ reason: 'key_unreadable', source, message: `${status.error}.` }, options);
|
|
43
|
+
}
|
|
44
|
+
// Downstream this key is dropped as unusable, which reads as "no key" and silently
|
|
45
|
+
// downgrades every install to a browser sign-in Hermes cannot take.
|
|
46
|
+
if (!validateKeyFormat(status.key)) {
|
|
47
|
+
return block({
|
|
48
|
+
reason: 'key_malformed',
|
|
49
|
+
source,
|
|
50
|
+
message: `Your SpringBrand API key is not shaped like one. ${KEY_FORMAT_HINT}`,
|
|
51
|
+
}, options);
|
|
52
|
+
}
|
|
53
|
+
// Local evidence, so the mismatch is named here rather than arriving as a bare 401 later.
|
|
54
|
+
const keyEnvironment = parseKeyIdentity(status.key)?.environment;
|
|
55
|
+
const endpointEnvironment = environmentOf(options.mcpUrl);
|
|
56
|
+
if (keyEnvironment && endpointEnvironment && keyEnvironment !== endpointEnvironment) {
|
|
57
|
+
return block({
|
|
58
|
+
reason: 'key_environment_mismatch',
|
|
59
|
+
source,
|
|
60
|
+
message: `Your SpringBrand API key is a ${keyEnvironment} key, but ${endpointOf(options.mcpUrl)} ` +
|
|
61
|
+
`only accepts ${endpointEnvironment} keys.`,
|
|
62
|
+
}, options);
|
|
63
|
+
}
|
|
64
|
+
const verified = await verifyMcpAuth(status.key, apiBaseFromMcpUrl(options.mcpUrl));
|
|
65
|
+
if (verified.ok)
|
|
66
|
+
return 'ok';
|
|
67
|
+
// Rate limits, verification outages and network faults keep the credential: blocking a whole
|
|
68
|
+
// setup on them would strand a user whose key is fine.
|
|
69
|
+
if (verified.kind !== 'credential_rejected') {
|
|
70
|
+
const retry = verified.retryAfter === undefined ? '' : ` Retry in ${verified.retryAfter}s.`;
|
|
71
|
+
warnLine(`Could not check your SpringBrand API key (${verified.code ?? 'unknown'}); continuing.${retry}`);
|
|
72
|
+
return 'ok';
|
|
73
|
+
}
|
|
74
|
+
return block({
|
|
75
|
+
reason: 'key_rejected',
|
|
76
|
+
source,
|
|
77
|
+
message: `Your SpringBrand API key was rejected (${verified.code ?? 'unknown'}).`,
|
|
78
|
+
...(verified.status === undefined ? {} : { status: verified.status }),
|
|
79
|
+
}, options);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=connect-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-preflight.js","sourceRoot":"","sources":["../../src/lib/connect-preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** 复刻自 tiny-fish CLI 编译产物:connect-runtime.d.ts + connect-runtime.impl.js */
|
|
2
|
+
import type { AuthMode } from './harness-detect.js';
|
|
3
|
+
import type { Harness, HarnessSupportCheck } from './harness-spec.js';
|
|
4
|
+
export declare const NON_INTERACTIVE_TIMEOUT_MS = 10000;
|
|
5
|
+
export declare const CONNECT_FAILURE_REASONS: readonly ["harness_not_installed", "harness_command_unsupported", "harness_too_old", "key_auth_unsupported", "command_not_found", "timeout", "spawn_error", "nonzero_exit", "invalid_config", "user_abandoned", "process_terminated", "unexpected_error"];
|
|
6
|
+
/** Ctrl+C killed a setup child — abandonment, not error. */
|
|
7
|
+
export declare class ConnectInterruptedError extends Error {
|
|
8
|
+
}
|
|
9
|
+
/** Carried hoisted-install failure an earlier harness already reported. */
|
|
10
|
+
export declare class HoistedFailureReportedError extends Error {
|
|
11
|
+
}
|
|
12
|
+
/** A classified step failure; runGuarded forwards the reason. */
|
|
13
|
+
export declare class ConnectStepError extends Error {
|
|
14
|
+
readonly failureReason: ConnectFailureReason;
|
|
15
|
+
readonly harnessVersion?: string;
|
|
16
|
+
readonly failureDetail?: string;
|
|
17
|
+
constructor(message: string, failureReason: ConnectFailureReason, opts?: {
|
|
18
|
+
harnessVersion?: string;
|
|
19
|
+
cause?: unknown;
|
|
20
|
+
failureDetail?: string;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/** Hoisted install predates this attempt's telemetry; the gap reads ~0 ms. */
|
|
24
|
+
export declare function withStageDuration(error: Error, stageDurationMs: number): Error;
|
|
25
|
+
export declare function stageDurationOf(error: unknown): number | undefined;
|
|
26
|
+
/** A bounded sign-in wait elapsed — unfinished, not broken. */
|
|
27
|
+
export declare class SignInTimeoutError extends ConnectStepError {
|
|
28
|
+
constructor(message: string, cause?: unknown);
|
|
29
|
+
}
|
|
30
|
+
export declare function throwIfInterrupted(result: {
|
|
31
|
+
signal?: string | null;
|
|
32
|
+
error?: Error;
|
|
33
|
+
}): void;
|
|
34
|
+
/** Bounded removal spawn shared by install cleanup and --uninstall; Ctrl+C throws. */
|
|
35
|
+
export declare function spawnRemoval(command: string, args: readonly string[], timeoutMs?: number): import("child_process").SpawnSyncReturns<string>;
|
|
36
|
+
/** Outcome plus a bounded stderr tail; the route sanitizes and caps the rest. */
|
|
37
|
+
export declare function spawnFailureDetail(result: SpawnStepResult): string;
|
|
38
|
+
/** Classifies a spawn failure; interrupts throw instead. */
|
|
39
|
+
export declare function spawnStepError(message: string, result: SpawnStepResult, failureDetail?: string): ConnectStepError;
|
|
40
|
+
export declare function commandNotFound(error: unknown): boolean;
|
|
41
|
+
/** One command redoes every post-install step for a client. */
|
|
42
|
+
export declare function finishSetupCommand(client: AgentClient): string;
|
|
43
|
+
/** Terminal events exactly once, whichever of flow or signal handler wins. */
|
|
44
|
+
export declare function settle(state: ConnectRunState, telemetry: ConnectTelemetry, stage: ConnectStage, detail?: ConnectStageDetail): void;
|
|
45
|
+
/** Shared terminal handling: interrupted → aborted, else failed. */
|
|
46
|
+
export declare function runGuarded(state: ConnectRunState, telemetry: ConnectTelemetry, body: () => void | Promise<void>): Promise<void>;
|
|
47
|
+
/** Refresh paths need the advertised alternative without connect's version probe. */
|
|
48
|
+
export declare function probeSupportVariant(client: SupportedCommand): string | undefined;
|
|
49
|
+
export declare function requireCommandSupport(client: SupportedCommand): {
|
|
50
|
+
optionalSupported: boolean;
|
|
51
|
+
keyAuthSupported: boolean;
|
|
52
|
+
matchedVariant?: string;
|
|
53
|
+
harnessVersion?: string;
|
|
54
|
+
};
|
|
55
|
+
export declare function createConnectTelemetry(mcpUrl: string, client: AgentClient, opts?: {
|
|
56
|
+
attemptId?: string;
|
|
57
|
+
fallbackAttemptId?: string;
|
|
58
|
+
}): ConnectTelemetry;
|
|
59
|
+
export type AgentClient = Harness;
|
|
60
|
+
type ConnectStage = 'started' | 'checkpoint' | 'completed' | 'failed' | 'aborted' | 'post_install_failed';
|
|
61
|
+
export type ConnectFailureStage = 'prerequisite_check' | 'registration_cleanup' | 'registration' | 'registration_or_authentication' | 'client_oauth' | 'cli_install' | 'skill_install' | 'plugin_install' | 'authentication' | 'walkthrough_launch' | 'cli_verification';
|
|
62
|
+
export type ConnectFailureReason = (typeof CONNECT_FAILURE_REASONS)[number];
|
|
63
|
+
export type ConnectAuthMode = Exclude<AuthMode, AuthMode.Unknown> | 'deferred';
|
|
64
|
+
export type ConnectCheckpoint = 'prerequisite_ok' | 'registered' | 'oauth_done' | 'cli_installed' | 'skill_installed' | 'plugin_installed' | 'authenticated' | 'cli_verified' | 'walkthrough_launched' | 'walkthrough_prompt_printed';
|
|
65
|
+
export type CliFallbackOutcome = 'cli_verified' | 'cli_install_failed' | 'no_credentials' | 'invalid_credentials' | 'authentication_failed' | 'verification_failed' | 'abandoned';
|
|
66
|
+
export interface SpawnStepResult {
|
|
67
|
+
status?: number | null;
|
|
68
|
+
signal?: string | null;
|
|
69
|
+
error?: Error;
|
|
70
|
+
/** Inherited stdio leaves this null; only piped runs yield text. */
|
|
71
|
+
stderr?: unknown;
|
|
72
|
+
}
|
|
73
|
+
export interface ConnectRunState {
|
|
74
|
+
stage: ConnectFailureStage;
|
|
75
|
+
settled: boolean;
|
|
76
|
+
/** On state, not per-call: otherwise degraded installs never appear to fail. */
|
|
77
|
+
harnessDegraded?: boolean;
|
|
78
|
+
/** Resolved after the probe, so callers read real key use rather than key presence. */
|
|
79
|
+
authMode?: ConnectAuthMode;
|
|
80
|
+
}
|
|
81
|
+
interface ConnectStageDetail {
|
|
82
|
+
failedStage?: ConnectFailureStage;
|
|
83
|
+
phase?: ConnectCheckpoint;
|
|
84
|
+
failureReason?: ConnectFailureReason;
|
|
85
|
+
harnessVersion?: string;
|
|
86
|
+
/** The plugin the client pins, not a probe of what landed. */
|
|
87
|
+
pluginVersion?: string;
|
|
88
|
+
authMode?: ConnectAuthMode;
|
|
89
|
+
/** Orthogonal to `authMode`: a stored key wins over `mcp login` on a healthy client too. */
|
|
90
|
+
harnessDegraded?: boolean;
|
|
91
|
+
/** Overrides the event-gap duration; the hoisted CLI install measures itself. */
|
|
92
|
+
stageDurationMs?: number;
|
|
93
|
+
/** Dropped from the wire unless `failedStage` is set (route refine). */
|
|
94
|
+
failureDetail?: string;
|
|
95
|
+
}
|
|
96
|
+
export interface ConnectTelemetry {
|
|
97
|
+
attemptId: string;
|
|
98
|
+
track(stage: ConnectStage, detail?: ConnectStageDetail): void;
|
|
99
|
+
setHarnessVersion(version?: string): void;
|
|
100
|
+
setFallbackOutcome(outcome: CliFallbackOutcome): void;
|
|
101
|
+
flush(): Promise<void>;
|
|
102
|
+
}
|
|
103
|
+
export interface SupportedCommand {
|
|
104
|
+
command: string;
|
|
105
|
+
displayName: string;
|
|
106
|
+
supportCheck: HarnessSupportCheck;
|
|
107
|
+
}
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=connect-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-runtime.d.ts","sourceRoot":"","sources":["../../src/lib/connect-runtime.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAStE,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,eAAO,MAAM,uBAAuB,EAAE,SAAS,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,CAa7R,CAAC;AACF,4DAA4D;AAC5D,qBAAa,uBAAwB,SAAQ,KAAK;CACjD;AACD,2EAA2E;AAC3E,qBAAa,2BAA4B,SAAQ,KAAK;CACrD;AACD,iEAAiE;AACjE,qBAAa,gBAAiB,SAAQ,KAAK;IACvC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBACpB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE;QACrE,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;KAC1B;CAMJ;AACD,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,GAAG,KAAK,CAG9E;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGlE;AACD,+DAA+D;AAC/D,qBAAa,kBAAmB,SAAQ,gBAAgB;gBACxC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAG/C;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACvC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB,GAAG,IAAI,CASP;AACD,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,eAAe,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAO3I;AAGD,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAOlE;AACD,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAYjH;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEvD;AACD,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE9D;AACD,8EAA8E;AAC9E,wBAAgB,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAKlI;AAgBD,oEAAoE;AACpE,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CrI;AA6DD,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAIhF;AACD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG;IAC7D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B,CAcA;AA4BD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,gBAAgB,CAuEnB;AAGD,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC;AAElC,KAAK,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,qBAAqB,CAAC;AAE1G,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG,sBAAsB,GAAG,cAAc,GAAG,gCAAgC,GAAG,cAAc,GAAG,aAAa,GAAG,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAEzQ,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,eAAe,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,eAAe,GAAG,cAAc,GAAG,sBAAsB,GAAG,4BAA4B,CAAC;AAEtO,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,qBAAqB,GAAG,WAAW,CAAC;AAElL,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,UAAU,kBAAkB;IACxB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,4FAA4F;IAC5F,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9D,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,mBAAmB,CAAC;CACrC"}
|