@tiangong-ai/cli 0.0.23 → 0.0.25
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/AGENTS.md +2 -1
- package/README.md +44 -32
- package/dist/io.d.ts +3 -0
- package/dist/io.js.map +1 -1
- package/dist/main.js +1 -0
- package/dist/main.js.map +1 -1
- package/dist/research/orchestration.js +7 -0
- package/dist/research/orchestration.js.map +1 -1
- package/dist/research/setup-command.d.ts +3 -0
- package/dist/research/setup-command.js +487 -0
- package/dist/research/setup-command.js.map +1 -0
- package/dist/research/workspace/broker.js +39 -4
- package/dist/research/workspace/broker.js.map +1 -1
- package/dist/research/workspace/capabilities.js +64 -0
- package/dist/research/workspace/capabilities.js.map +1 -1
- package/dist/research/workspace/constants.d.ts +3 -2
- package/dist/research/workspace/constants.js +19 -0
- package/dist/research/workspace/constants.js.map +1 -1
- package/dist/research/workspace/context.js +26 -1
- package/dist/research/workspace/context.js.map +1 -1
- package/dist/research/workspace/external-skills.d.ts +20 -1
- package/dist/research/workspace/external-skills.js +143 -2
- package/dist/research/workspace/external-skills.js.map +1 -1
- package/dist/research/workspace/runtime.js +1 -1
- package/dist/research/workspace/runtime.js.map +1 -1
- package/dist/research/workspace/setup-catalog.d.ts +175 -0
- package/dist/research/workspace/setup-catalog.js +588 -0
- package/dist/research/workspace/setup-catalog.js.map +1 -0
- package/dist/research/workspace/setup-wizard.d.ts +24 -0
- package/dist/research/workspace/setup-wizard.js +476 -0
- package/dist/research/workspace/setup-wizard.js.map +1 -0
- package/dist/research/workspace/setup.d.ts +468 -0
- package/dist/research/workspace/setup.js +3000 -0
- package/dist/research/workspace/setup.js.map +1 -0
- package/dist/research/workspace/storage.js +7 -0
- package/dist/research/workspace/storage.js.map +1 -1
- package/dist/research/workspace/types.d.ts +13 -1
- package/dist/research/workspace/workspace.js +56 -7
- package/dist/research/workspace/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { lstat, mkdir } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute, resolve } from "node:path";
|
|
3
|
+
import { createInterface } from "node:readline/promises";
|
|
4
|
+
import { CliError } from "../../errors.js";
|
|
5
|
+
import { stringifyJson, write } from "../../io.js";
|
|
6
|
+
import { parseStrictArgs, strictBoolean, strictString } from "../../strict-args.js";
|
|
7
|
+
import { EXTERNAL_SKILL_CONTEXT_PROFILE, EXTERNAL_SKILL_MEDIA_PROFILE, EXTERNAL_SKILL_PROFILE, } from "./external-skills.js";
|
|
8
|
+
import { RESEARCH_SETUP_CREDENTIALS, RESEARCH_SETUP_INSTALLER, RESEARCH_SETUP_SELECTION_GUIDANCE, RESEARCH_SETUP_SETTINGS, RESEARCH_SETUP_SKILLS, resolveSetupSkills, setupSource, setupTargetRoot, } from "./setup-catalog.js";
|
|
9
|
+
import { applyResearchSetupPlan, createResearchSetupPlan, inspectResearchSetupStatus, } from "./setup.js";
|
|
10
|
+
import { pathExists, workspacePaths } from "./storage.js";
|
|
11
|
+
const DEFAULT_CREDENTIAL_ENVIRONMENT = {
|
|
12
|
+
"brave.search.api-key": "BRAVE_API_KEY",
|
|
13
|
+
"tiangong.sci.api-key": "TIANGONG_SCI_APIKEY",
|
|
14
|
+
"tiangong.unstructure.auth-token": "UNSTRUCTURED_AUTH_TOKEN",
|
|
15
|
+
"semantic-scholar.api-key": "SEMANTIC_SCHOLAR_API_KEY",
|
|
16
|
+
};
|
|
17
|
+
export async function runResearchSetupWizard(argv, io) {
|
|
18
|
+
const args = parseStrictArgs(argv, { help: "boolean", json: "boolean", workspace: "string" }, "research setup wizard");
|
|
19
|
+
if (strictBoolean(args, "help")) {
|
|
20
|
+
write(io.stdout, "Usage: tiangong-ai research setup [--workspace <absolute-path>] [--json]\n");
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
if (args.positionals.length) {
|
|
24
|
+
throw new CliError("research setup Wizard does not accept positional arguments.", {
|
|
25
|
+
code: "INVALID_ARGS",
|
|
26
|
+
exitCode: 2,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (!io.stdin?.isTTY) {
|
|
30
|
+
throw new CliError("Interactive research setup requires a TTY.", {
|
|
31
|
+
code: "RESEARCH_SETUP_TTY_REQUIRED",
|
|
32
|
+
exitCode: 2,
|
|
33
|
+
details: {
|
|
34
|
+
step: "wizard",
|
|
35
|
+
reason: "No interactive terminal is attached.",
|
|
36
|
+
minimumAction: "Run the Wizard in a terminal, or use research setup catalog/plan/apply for automation.",
|
|
37
|
+
retryCommand: "tiangong-ai research setup --help",
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const prompt = new TextResearchSetupWizardPrompt(io.stdin, io.stderr);
|
|
42
|
+
try {
|
|
43
|
+
const workspace = strictString(args, "workspace");
|
|
44
|
+
const result = await executeResearchSetupWizard({
|
|
45
|
+
...(workspace === undefined ? {} : { workspace }),
|
|
46
|
+
environment: io.env,
|
|
47
|
+
prompt,
|
|
48
|
+
});
|
|
49
|
+
write(io.stdout, stringifyJson(result.value, strictBoolean(args, "json")));
|
|
50
|
+
return result.exitCode;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
prompt.close();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function executeResearchSetupWizard(input) {
|
|
57
|
+
const { prompt } = input;
|
|
58
|
+
prompt.note([
|
|
59
|
+
"Tiangong Auto Research setup",
|
|
60
|
+
"No Skill is bundled or installed until you review the exact plan and confirm it.",
|
|
61
|
+
"Credentials are read only from owner environment variables; their values are never displayed.",
|
|
62
|
+
].join("\n"));
|
|
63
|
+
const defaultWorkspace = resolve(input.workspace ?? process.cwd());
|
|
64
|
+
const workspaceInput = await prompt.input("Absolute workspace directory", defaultWorkspace);
|
|
65
|
+
if (!isAbsolute(workspaceInput)) {
|
|
66
|
+
throw wizardError("Workspace must be an absolute path.", "workspace");
|
|
67
|
+
}
|
|
68
|
+
const workspace = resolve(workspaceInput);
|
|
69
|
+
const existingInfo = await lstat(workspace).catch(() => undefined);
|
|
70
|
+
let createWorkspaceDirectory = false;
|
|
71
|
+
if (!existingInfo) {
|
|
72
|
+
createWorkspaceDirectory = await prompt.confirm(`Directory does not exist. Create exactly ${workspace}?`, false);
|
|
73
|
+
if (!createWorkspaceDirectory)
|
|
74
|
+
throw wizardCancelled("workspace");
|
|
75
|
+
}
|
|
76
|
+
else if (!existingInfo.isDirectory() || existingInfo.isSymbolicLink()) {
|
|
77
|
+
throw wizardError("Workspace must be a regular non-symlink directory.", "workspace");
|
|
78
|
+
}
|
|
79
|
+
if (existingInfo && (await pathExists(workspacePaths(workspace).setupPlan))) {
|
|
80
|
+
const existingAction = await prompt.select("An immutable setup plan already exists", [
|
|
81
|
+
{ value: "status", label: "Inspect status and stop" },
|
|
82
|
+
{ value: "apply", label: "Apply/resume the existing plan" },
|
|
83
|
+
{ value: "replace", label: "Create an explicitly reviewed replacement plan" },
|
|
84
|
+
{ value: "cancel", label: "Cancel" },
|
|
85
|
+
], "status");
|
|
86
|
+
if (existingAction === "status") {
|
|
87
|
+
return {
|
|
88
|
+
exitCode: 0,
|
|
89
|
+
value: await inspectResearchSetupStatus(workspace, input.environment),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (existingAction === "apply") {
|
|
93
|
+
const value = await applyResearchSetupPlan(workspacePaths(workspace).setupPlan, {
|
|
94
|
+
environment: input.environment,
|
|
95
|
+
});
|
|
96
|
+
return { exitCode: value.state.status === "blocked" ? 3 : 0, value };
|
|
97
|
+
}
|
|
98
|
+
if (existingAction === "cancel")
|
|
99
|
+
throw wizardCancelled("resume");
|
|
100
|
+
}
|
|
101
|
+
const mode = await prompt.select("Research mode", [
|
|
102
|
+
{
|
|
103
|
+
value: "production-research",
|
|
104
|
+
label: "Production research (requires public-internet evidence)",
|
|
105
|
+
},
|
|
106
|
+
{ value: "smoke-test", label: "Smoke test (low-cost workflow validation)" },
|
|
107
|
+
], "production-research");
|
|
108
|
+
const evidenceChoices = [
|
|
109
|
+
{
|
|
110
|
+
value: EXTERNAL_SKILL_CONTEXT_PROFILE,
|
|
111
|
+
label: "Brave web + news + bounded full-text context (recommended)",
|
|
112
|
+
},
|
|
113
|
+
{ value: EXTERNAL_SKILL_PROFILE, label: "Brave web + news" },
|
|
114
|
+
{
|
|
115
|
+
value: EXTERNAL_SKILL_MEDIA_PROFILE,
|
|
116
|
+
label: "Brave context + image/video discovery",
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
if (mode === "smoke-test") {
|
|
120
|
+
evidenceChoices.push({ value: "none", label: "No public internet (smoke test only)" });
|
|
121
|
+
}
|
|
122
|
+
const evidenceProfile = await prompt.select("Independent public-internet evidence profile", evidenceChoices, EXTERNAL_SKILL_CONTEXT_PROFILE);
|
|
123
|
+
const companionChoices = RESEARCH_SETUP_SKILLS.filter((skill) => skill.sourceId === "tiangong-ai-skills" && skill.role !== "post-closure-authoring").map((skill) => ({ value: skill.id, label: `${skill.skillName} — ${skill.purpose}` }));
|
|
124
|
+
const companionIds = await prompt.multiSelect("Optional Tiangong companion Skills (explicit selection)", companionChoices, companionChoices
|
|
125
|
+
.map((choice) => RESEARCH_SETUP_SKILLS.find((skill) => skill.id === choice.value))
|
|
126
|
+
.filter((skill) => skill.defaultSelected)
|
|
127
|
+
.map((skill) => skill.id));
|
|
128
|
+
let authoringIds = [];
|
|
129
|
+
if (await prompt.confirm("Review optional post-closure authoring Skills? They do not become research evidence capabilities.", false)) {
|
|
130
|
+
const choices = RESEARCH_SETUP_SKILLS.filter((skill) => skill.role === "post-closure-authoring")
|
|
131
|
+
.sort((left, right) => postClosureAuthoringRank(left.id) - postClosureAuthoringRank(right.id) ||
|
|
132
|
+
left.skillName.localeCompare(right.skillName))
|
|
133
|
+
.map((skill) => ({ value: skill.id, label: `${skill.skillName} — ${skill.purpose}` }));
|
|
134
|
+
authoringIds = await prompt.multiSelect("Post-closure authoring Skills", choices, []);
|
|
135
|
+
}
|
|
136
|
+
const explicitSkillIds = [...new Set([...companionIds, ...authoringIds])];
|
|
137
|
+
const profileSkillIds = evidenceProfileSkillIds(evidenceProfile);
|
|
138
|
+
const selected = resolveSetupSkills([...profileSkillIds, ...explicitSkillIds]);
|
|
139
|
+
const evidenceSelected = selected.some((skill) => skill.role === "evidence-capability");
|
|
140
|
+
const agentChoice = await prompt.select("Install targets", evidenceSelected
|
|
141
|
+
? [
|
|
142
|
+
{ value: "codex", label: "Codex only (.agents/skills)" },
|
|
143
|
+
{ value: "both", label: "Codex and Claude Code (two copied trees)" },
|
|
144
|
+
]
|
|
145
|
+
: [
|
|
146
|
+
{ value: "codex", label: "Codex only (.agents/skills)" },
|
|
147
|
+
{ value: "claude-code", label: "Claude Code only (.claude/skills)" },
|
|
148
|
+
{ value: "both", label: "Codex and Claude Code" },
|
|
149
|
+
], "codex");
|
|
150
|
+
const agents = agentChoice === "both" ? ["codex", "claude-code"] : [agentChoice];
|
|
151
|
+
const scope = await prompt.select("Installation scope", [
|
|
152
|
+
{ value: "project", label: "Project-local copy (recommended, auditable)" },
|
|
153
|
+
{ value: "global", label: "Global copy (affects other workspaces)" },
|
|
154
|
+
], "project");
|
|
155
|
+
let confirmGlobalMutation = false;
|
|
156
|
+
if (scope === "global") {
|
|
157
|
+
prompt.note(`Global targets:\n${agents
|
|
158
|
+
.map((agent) => ` ${agent}: ${setupTargetRoot({ workspace, scope, agent, environment: input.environment })}`)
|
|
159
|
+
.join("\n")}`);
|
|
160
|
+
confirmGlobalMutation = await prompt.confirm("I understand this writes outside the workspace", false);
|
|
161
|
+
if (!confirmGlobalMutation)
|
|
162
|
+
throw wizardCancelled("global-confirmation");
|
|
163
|
+
}
|
|
164
|
+
const settings = await collectSettings(selected.map((skill) => skill.id), prompt);
|
|
165
|
+
const credentialEnvironment = await collectCredentialSources(selected.map((skill) => skill.id), input.environment, prompt);
|
|
166
|
+
const acceptedLicenseIds = await collectLicenseAcceptances(selected.map((skill) => skill.id), prompt);
|
|
167
|
+
const agentRoutes = await collectAgentRoutes(prompt);
|
|
168
|
+
const liveChecks = await prompt.confirm("Run live provider checks after installation? This uses network/quota but does not run model agents.", false);
|
|
169
|
+
const allowSyntheticUnstructureUpload = liveChecks && selected.some((skill) => skill.id === "tiangong.document-granular-decompose")
|
|
170
|
+
? await prompt.confirm("Authorize upload of a generated one-page PDF to the configured Unstructure service?", false)
|
|
171
|
+
: false;
|
|
172
|
+
const agentSmoke = await prompt.confirm("Run producer/reviewer agent smoke checks after installation? This may consume paid model quota.", false);
|
|
173
|
+
const confirmAgentSmokeCost = agentSmoke
|
|
174
|
+
? await prompt.confirm("I explicitly authorize the agent smoke-check cost", false)
|
|
175
|
+
: false;
|
|
176
|
+
if (agentSmoke && !confirmAgentSmokeCost)
|
|
177
|
+
throw wizardCancelled("agent-smoke-confirmation");
|
|
178
|
+
const missingRequiredCredentialIds = requiredCredentialIds(selected.map((skill) => skill.id).filter(Boolean)).filter((id) => {
|
|
179
|
+
const environmentName = credentialEnvironment[id];
|
|
180
|
+
const definition = RESEARCH_SETUP_CREDENTIALS.find((item) => item.id === id);
|
|
181
|
+
return (!environmentName ||
|
|
182
|
+
Buffer.byteLength(input.environment[environmentName] ?? "", "utf8") <
|
|
183
|
+
definition.minimumUtf8Bytes);
|
|
184
|
+
});
|
|
185
|
+
const preview = {
|
|
186
|
+
workspace,
|
|
187
|
+
createWorkspaceDirectory,
|
|
188
|
+
mode,
|
|
189
|
+
evidenceProfile,
|
|
190
|
+
selectedSkillIds: selected.map((skill) => skill.id),
|
|
191
|
+
install: {
|
|
192
|
+
scope,
|
|
193
|
+
agents,
|
|
194
|
+
targets: agents.map((agent) => ({
|
|
195
|
+
agent,
|
|
196
|
+
root: setupTargetRoot({ workspace, scope, agent, environment: input.environment }),
|
|
197
|
+
})),
|
|
198
|
+
},
|
|
199
|
+
installer: RESEARCH_SETUP_INSTALLER,
|
|
200
|
+
sourcePins: [...new Set(selected.map((skill) => skill.sourceId))].map((sourceId) => {
|
|
201
|
+
const source = setupSource(sourceId);
|
|
202
|
+
return {
|
|
203
|
+
id: source.id,
|
|
204
|
+
locator: source.locator,
|
|
205
|
+
immutableRef: source.immutableRef,
|
|
206
|
+
};
|
|
207
|
+
}),
|
|
208
|
+
skillPins: selected.map((skill) => ({
|
|
209
|
+
id: skill.id,
|
|
210
|
+
role: skill.role,
|
|
211
|
+
expectedTreeSha256: skill.expectedTreeSha256,
|
|
212
|
+
licenseId: skill.license.id,
|
|
213
|
+
})),
|
|
214
|
+
acceptedLicenseIds,
|
|
215
|
+
configuredCredentialEnvironmentNames: Object.entries(credentialEnvironment).map(([id, environmentName]) => ({
|
|
216
|
+
id,
|
|
217
|
+
environmentName,
|
|
218
|
+
present: Boolean(input.environment[environmentName]),
|
|
219
|
+
})),
|
|
220
|
+
missingRequiredCredentialIds,
|
|
221
|
+
checks: { liveChecks, allowSyntheticUnstructureUpload, agentSmoke },
|
|
222
|
+
networkDownloads: selected.length > 0,
|
|
223
|
+
};
|
|
224
|
+
prompt.note(`Reviewed setup preview:\n${JSON.stringify(preview, null, 2)}`);
|
|
225
|
+
const confirmNetworkDownloads = selected.length === 0 ||
|
|
226
|
+
(await prompt.confirm("Authorize downloads of only the displayed pinned npm package and git commits?", false));
|
|
227
|
+
if (!confirmNetworkDownloads)
|
|
228
|
+
throw wizardCancelled("network-confirmation");
|
|
229
|
+
if (!(await prompt.confirm("Create this immutable setup plan?", false))) {
|
|
230
|
+
throw wizardCancelled("plan-confirmation");
|
|
231
|
+
}
|
|
232
|
+
if (createWorkspaceDirectory)
|
|
233
|
+
await mkdir(workspace);
|
|
234
|
+
const replacePlan = await pathExists(workspacePaths(workspace).setupPlan);
|
|
235
|
+
const plan = await createResearchSetupPlan({
|
|
236
|
+
workspace,
|
|
237
|
+
mode,
|
|
238
|
+
evidenceProfile,
|
|
239
|
+
skillIds: explicitSkillIds,
|
|
240
|
+
scope,
|
|
241
|
+
agents,
|
|
242
|
+
acceptedLicenseIds,
|
|
243
|
+
credentialEnvironment,
|
|
244
|
+
settings,
|
|
245
|
+
agentRoutes,
|
|
246
|
+
liveChecks,
|
|
247
|
+
allowSyntheticUnstructureUpload,
|
|
248
|
+
agentSmoke,
|
|
249
|
+
confirmNetworkDownloads,
|
|
250
|
+
confirmGlobalMutation,
|
|
251
|
+
confirmAgentSmokeCost,
|
|
252
|
+
replacePlan,
|
|
253
|
+
environment: input.environment,
|
|
254
|
+
});
|
|
255
|
+
prompt.note(`Plan created: ${workspacePaths(workspace).setupPlan}\nSHA-256: ${plan.planSha256}`);
|
|
256
|
+
if (missingRequiredCredentialIds.length) {
|
|
257
|
+
prompt.note(`Apply is blocked until these required owner environment variables are set: ${missingRequiredCredentialIds.join(", ")}`);
|
|
258
|
+
}
|
|
259
|
+
const applyNow = await prompt.confirm(missingRequiredCredentialIds.length
|
|
260
|
+
? "Apply now anyway? Preflight will stop before downloads because required credentials are absent."
|
|
261
|
+
: "Apply the reviewed plan now?", false);
|
|
262
|
+
if (!applyNow) {
|
|
263
|
+
return {
|
|
264
|
+
exitCode: 0,
|
|
265
|
+
value: {
|
|
266
|
+
schemaVersion: 1,
|
|
267
|
+
status: "planned",
|
|
268
|
+
plan,
|
|
269
|
+
next: `tiangong-ai research setup apply --plan ${workspacePaths(workspace).setupPlan} --json`,
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const value = await applyResearchSetupPlan(workspacePaths(workspace).setupPlan, {
|
|
274
|
+
environment: input.environment,
|
|
275
|
+
});
|
|
276
|
+
return { exitCode: value.state.status === "blocked" ? 3 : 0, value };
|
|
277
|
+
}
|
|
278
|
+
function postClosureAuthoringRank(skillId) {
|
|
279
|
+
const guidance = RESEARCH_SETUP_SELECTION_GUIDANCE.pptCreation;
|
|
280
|
+
if (skillId === guidance.preferredSkillId)
|
|
281
|
+
return 0;
|
|
282
|
+
if (guidance.situationalSkillIds.includes(skillId))
|
|
283
|
+
return 1;
|
|
284
|
+
return 2;
|
|
285
|
+
}
|
|
286
|
+
async function collectSettings(selectedSkillIds, prompt) {
|
|
287
|
+
const selected = new Set(selectedSkillIds);
|
|
288
|
+
const settings = {};
|
|
289
|
+
for (const setting of RESEARCH_SETUP_SETTINGS.filter((item) => item.requiredBy.some((skillId) => selected.has(skillId)))) {
|
|
290
|
+
const value = await prompt.input(`${setting.label}${setting.required ? " (required)" : " (optional; blank to omit)"}`, setting.defaultValue ?? "");
|
|
291
|
+
if (value.trim())
|
|
292
|
+
settings[setting.id] = value.trim();
|
|
293
|
+
}
|
|
294
|
+
return settings;
|
|
295
|
+
}
|
|
296
|
+
async function collectCredentialSources(selectedSkillIds, environment, prompt) {
|
|
297
|
+
const selected = new Set(selectedSkillIds);
|
|
298
|
+
const result = {};
|
|
299
|
+
for (const credential of RESEARCH_SETUP_CREDENTIALS.filter((item) => item.requiredBy.some((skillId) => selected.has(skillId)))) {
|
|
300
|
+
const defaultEnvironmentName = DEFAULT_CREDENTIAL_ENVIRONMENT[credential.id];
|
|
301
|
+
const present = Buffer.byteLength(environment[defaultEnvironmentName] ?? "", "utf8") >=
|
|
302
|
+
credential.minimumUtf8Bytes;
|
|
303
|
+
prompt.note(`${credential.provider}\n credential: ${credential.id}\n obtain/configure: ${credential.obtainAt}\n ${defaultEnvironmentName}: ${present ? "present" : "not present"}`);
|
|
304
|
+
if (!credential.required && !present) {
|
|
305
|
+
const configure = await prompt.confirm(`Configure optional ${credential.id} from an environment variable?`, false);
|
|
306
|
+
if (!configure)
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const environmentName = await prompt.input(`Environment variable name for ${credential.id} (never the secret value)`, defaultEnvironmentName);
|
|
310
|
+
if (environmentName.trim())
|
|
311
|
+
result[credential.id] = environmentName.trim();
|
|
312
|
+
}
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
async function collectLicenseAcceptances(selectedSkillIds, prompt) {
|
|
316
|
+
const selected = resolveSetupSkills(selectedSkillIds);
|
|
317
|
+
const groups = new Map();
|
|
318
|
+
for (const skill of selected) {
|
|
319
|
+
const group = groups.get(skill.license.id) ?? {
|
|
320
|
+
label: skill.license.label,
|
|
321
|
+
url: skill.license.url,
|
|
322
|
+
notice: skill.license.notice,
|
|
323
|
+
skillIds: [],
|
|
324
|
+
};
|
|
325
|
+
group.skillIds.push(skill.id);
|
|
326
|
+
groups.set(skill.license.id, group);
|
|
327
|
+
}
|
|
328
|
+
const accepted = [];
|
|
329
|
+
for (const [licenseId, group] of groups) {
|
|
330
|
+
prompt.note(`License review\n Skills: ${group.skillIds.join(", ")}\n License: ${group.label}\n URL: ${group.url}\n Notice: ${group.notice}`);
|
|
331
|
+
if (!(await prompt.confirm(`I reviewed and accept ${licenseId} for these selected Skills`, false))) {
|
|
332
|
+
throw wizardCancelled("license");
|
|
333
|
+
}
|
|
334
|
+
accepted.push(licenseId);
|
|
335
|
+
}
|
|
336
|
+
return accepted;
|
|
337
|
+
}
|
|
338
|
+
async function collectAgentRoutes(prompt) {
|
|
339
|
+
if (!(await prompt.confirm("Configure exact producer/reviewer model IDs now?", false)))
|
|
340
|
+
return {};
|
|
341
|
+
const producerModel = (await prompt.input("Producer model ID (blank to defer)", "")).trim();
|
|
342
|
+
const reviewerModel = (await prompt.input("Reviewer model ID (blank to defer)", "")).trim();
|
|
343
|
+
let producerPricing;
|
|
344
|
+
let reviewerPricing;
|
|
345
|
+
if (await prompt.confirm("Record reviewed per-million-token prices now?", false)) {
|
|
346
|
+
producerPricing = await collectPricing("Producer", prompt);
|
|
347
|
+
reviewerPricing = await collectPricing("Reviewer", prompt);
|
|
348
|
+
}
|
|
349
|
+
return {
|
|
350
|
+
...(producerModel ? { producerModel } : {}),
|
|
351
|
+
...(reviewerModel ? { reviewerModel } : {}),
|
|
352
|
+
...(producerPricing ? { producerPricing } : {}),
|
|
353
|
+
...(reviewerPricing ? { reviewerPricing } : {}),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
async function collectPricing(label, prompt) {
|
|
357
|
+
const raw = await prompt.input(`${label} prices as input,cached-input,output USD per million tokens`);
|
|
358
|
+
const values = raw.split(",").map((value) => Number(value.trim()));
|
|
359
|
+
if (values.length !== 3 || values.some((value) => !Number.isFinite(value) || value < 0)) {
|
|
360
|
+
throw wizardError("Pricing requires exactly three finite non-negative numbers.", "agent-route");
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
inputUsdPerMillionTokens: values[0],
|
|
364
|
+
cachedInputUsdPerMillionTokens: values[1],
|
|
365
|
+
outputUsdPerMillionTokens: values[2],
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
function evidenceProfileSkillIds(profile) {
|
|
369
|
+
if (profile === "none")
|
|
370
|
+
return [];
|
|
371
|
+
if (profile === EXTERNAL_SKILL_PROFILE)
|
|
372
|
+
return ["brave.web-search", "brave.news-search"];
|
|
373
|
+
if (profile === EXTERNAL_SKILL_CONTEXT_PROFILE) {
|
|
374
|
+
return ["brave.web-search", "brave.news-search", "brave.llm-context"];
|
|
375
|
+
}
|
|
376
|
+
return [
|
|
377
|
+
"brave.web-search",
|
|
378
|
+
"brave.news-search",
|
|
379
|
+
"brave.llm-context",
|
|
380
|
+
"brave.images-search",
|
|
381
|
+
"brave.videos-search",
|
|
382
|
+
];
|
|
383
|
+
}
|
|
384
|
+
function requiredCredentialIds(selectedSkillIds) {
|
|
385
|
+
const selected = new Set(selectedSkillIds);
|
|
386
|
+
return RESEARCH_SETUP_CREDENTIALS.filter((credential) => credential.required && credential.requiredBy.some((skillId) => selected.has(skillId))).map((credential) => credential.id);
|
|
387
|
+
}
|
|
388
|
+
class TextResearchSetupWizardPrompt {
|
|
389
|
+
#readline;
|
|
390
|
+
#output;
|
|
391
|
+
constructor(input, output) {
|
|
392
|
+
this.#output = output;
|
|
393
|
+
this.#readline = createInterface({
|
|
394
|
+
input,
|
|
395
|
+
output: output,
|
|
396
|
+
terminal: true,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
note(message) {
|
|
400
|
+
write(this.#output, `\n${message}\n`);
|
|
401
|
+
}
|
|
402
|
+
async input(message, defaultValue = "") {
|
|
403
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : "";
|
|
404
|
+
const answer = (await this.#readline.question(`${message}${suffix}: `)).trim();
|
|
405
|
+
return answer || defaultValue;
|
|
406
|
+
}
|
|
407
|
+
async confirm(message, defaultValue) {
|
|
408
|
+
const suffix = defaultValue ? " [Y/n]" : " [y/N]";
|
|
409
|
+
for (;;) {
|
|
410
|
+
const answer = (await this.#readline.question(`${message}${suffix}: `)).trim().toLowerCase();
|
|
411
|
+
if (!answer)
|
|
412
|
+
return defaultValue;
|
|
413
|
+
if (answer === "y" || answer === "yes")
|
|
414
|
+
return true;
|
|
415
|
+
if (answer === "n" || answer === "no")
|
|
416
|
+
return false;
|
|
417
|
+
this.note("Enter y or n.");
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
async select(message, choices, defaultValue) {
|
|
421
|
+
this.note(`${message}:\n${choices
|
|
422
|
+
.map((choice, index) => ` ${index + 1}. ${choice.label}${choice.value === defaultValue ? " [default]" : ""}`)
|
|
423
|
+
.join("\n")}`);
|
|
424
|
+
for (;;) {
|
|
425
|
+
const answer = await this.input("Choose one", "");
|
|
426
|
+
if (!answer)
|
|
427
|
+
return defaultValue;
|
|
428
|
+
const index = Number(answer) - 1;
|
|
429
|
+
if (Number.isInteger(index) && choices[index])
|
|
430
|
+
return choices[index].value;
|
|
431
|
+
const byValue = choices.find((choice) => choice.value === answer);
|
|
432
|
+
if (byValue)
|
|
433
|
+
return byValue.value;
|
|
434
|
+
this.note("Enter one displayed number or exact value.");
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
async multiSelect(message, choices, defaultValues) {
|
|
438
|
+
this.note(`${message}:\n${choices
|
|
439
|
+
.map((choice, index) => ` ${index + 1}. ${choice.label}${defaultValues.includes(choice.value) ? " [default]" : ""}`)
|
|
440
|
+
.join("\n")}`);
|
|
441
|
+
for (;;) {
|
|
442
|
+
const answer = await this.input("Choose comma-separated numbers; enter none for an empty selection", "");
|
|
443
|
+
if (!answer)
|
|
444
|
+
return [...defaultValues];
|
|
445
|
+
if (answer.toLowerCase() === "none")
|
|
446
|
+
return [];
|
|
447
|
+
const indexes = answer.split(",").map((value) => Number(value.trim()) - 1);
|
|
448
|
+
if (indexes.every((index) => Number.isInteger(index) && choices[index]) &&
|
|
449
|
+
new Set(indexes).size === indexes.length) {
|
|
450
|
+
return indexes.map((index) => choices[index].value);
|
|
451
|
+
}
|
|
452
|
+
this.note("Enter unique displayed numbers separated by commas, or none.");
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
close() {
|
|
456
|
+
this.#readline.close();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
function wizardCancelled(step) {
|
|
460
|
+
return new CliError("Research setup was cancelled without applying unreviewed changes.", {
|
|
461
|
+
code: "RESEARCH_SETUP_CANCELLED",
|
|
462
|
+
exitCode: 3,
|
|
463
|
+
details: {
|
|
464
|
+
step,
|
|
465
|
+
minimumAction: "Restart the Wizard when you are ready, or use setup plan for automation.",
|
|
466
|
+
},
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
function wizardError(message, step) {
|
|
470
|
+
return new CliError(message, {
|
|
471
|
+
code: "RESEARCH_SETUP_WIZARD_INVALID",
|
|
472
|
+
exitCode: 2,
|
|
473
|
+
details: { step, minimumAction: "Correct the displayed value and restart the Wizard." },
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=setup-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../../../src/research/workspace/setup-wizard.ts"],"names":[],"mappings":"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"}
|