@agenthifive/openclaw 0.2.3 → 0.3.1

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.
@@ -1,30 +0,0 @@
1
- /**
2
- * Setup wizard for AgentHiFive vault integration.
3
- *
4
- * Bootstraps agent auth, discovers capabilities, writes config to
5
- * openclaw.json, and auto-applies the credential resolution patch.
6
- *
7
- * Two modes:
8
- * - Interactive: prompts via Node.js readline
9
- * - Non-interactive: accepts --base-url, --bootstrap-secret, and other flags
10
- *
11
- * Registered as `openclaw setup-vault` via api.registerCommand() in register.ts.
12
- */
13
- export interface SetupOptions {
14
- baseUrl?: string;
15
- bootstrapSecret?: string;
16
- nonInteractive?: boolean;
17
- configPath?: string;
18
- openclawDir?: string;
19
- }
20
- export declare function buildConfigOutput(params: {
21
- baseUrl: string;
22
- agentId: string;
23
- privateKey: JsonWebKey;
24
- connections: Record<string, string>;
25
- connectedProviders: string[];
26
- proxiedProviders: string[];
27
- }): object;
28
- export declare function runSetupWizard(opts?: SetupOptions): Promise<void>;
29
- export declare function parseSetupArgs(args: string[]): SetupOptions;
30
- //# sourceMappingURL=setup-wizard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuBH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA6JD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,GAAG,MAAM,CA4BT;AAMD,wBAAsB,cAAc,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6O3E;AA6CD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CA4B3D"}
@@ -1,416 +0,0 @@
1
- /**
2
- * Setup wizard for AgentHiFive vault integration.
3
- *
4
- * Bootstraps agent auth, discovers capabilities, writes config to
5
- * openclaw.json, and auto-applies the credential resolution patch.
6
- *
7
- * Two modes:
8
- * - Interactive: prompts via Node.js readline
9
- * - Non-interactive: accepts --base-url, --bootstrap-secret, and other flags
10
- *
11
- * Registered as `openclaw setup-vault` via api.registerCommand() in register.ts.
12
- */
13
- import { mkdirSync, writeFileSync, existsSync } from "node:fs";
14
- import os from "node:os";
15
- import path from "node:path";
16
- import { generateKeyPair, exportJWK } from "jose";
17
- import { VaultTokenManager } from "./vault-token-manager.js";
18
- import { resolveOpenClawConfigPath, defaultConfigPath, readExistingConfig, mergePluginConfig, } from "./config-discovery.js";
19
- import { findOpenClawInstallDir, validateOpenClawDir, applyPatch, } from "./auto-patch.js";
20
- // ---------------------------------------------------------------------------
21
- // Readline helpers
22
- // ---------------------------------------------------------------------------
23
- async function prompt(question, defaultValue) {
24
- const { createInterface } = await import("node:readline");
25
- const rl = createInterface({ input: process.stdin, output: process.stdout });
26
- const suffix = defaultValue ? ` [${defaultValue}]` : "";
27
- return new Promise((resolve) => {
28
- rl.question(`${question}${suffix}: `, (answer) => {
29
- rl.close();
30
- resolve(answer.trim() || defaultValue || "");
31
- });
32
- });
33
- }
34
- async function confirm(question, defaultYes = true) {
35
- const hint = defaultYes ? "[Y/n]" : "[y/N]";
36
- const answer = await prompt(`${question} ${hint}`);
37
- if (!answer)
38
- return defaultYes;
39
- return answer.toLowerCase().startsWith("y");
40
- }
41
- // ---------------------------------------------------------------------------
42
- // OpenClaw onboarding check
43
- // ---------------------------------------------------------------------------
44
- /**
45
- * Check if OpenClaw has been onboarded (i.e. ~/.openclaw/ exists with config).
46
- * If not, print the command the user should run first.
47
- */
48
- function ensureOnboarded(log) {
49
- // Check if OpenClaw state directory exists with any config file
50
- const configPath = resolveOpenClawConfigPath();
51
- if (configPath)
52
- return; // Already onboarded
53
- // Check if the default directory at least exists
54
- const stateDir = path.join(os.homedir(), ".openclaw");
55
- if (existsSync(stateDir))
56
- return; // Directory exists, good enough
57
- const onboardCmd = "openclaw onboard --non-interactive --accept-risk --auth-choice skip " +
58
- "--install-daemon --skip-channels --skip-skills --skip-search --skip-health --skip-ui";
59
- log(" OpenClaw has not been set up yet.");
60
- log(" Run this first to set up the daemon and directory structure:");
61
- log("");
62
- log(` ${onboardCmd}`);
63
- log("");
64
- log(" Then re-run: openclaw setup-vault");
65
- log("");
66
- throw new Error("OpenClaw must be onboarded before running setup-vault");
67
- }
68
- // ---------------------------------------------------------------------------
69
- // Vault API helpers
70
- // ---------------------------------------------------------------------------
71
- async function bootstrapAgent(baseUrl, bootstrapSecret) {
72
- const { publicKey, privateKey } = await generateKeyPair("ES256");
73
- const publicJWK = await exportJWK(publicKey);
74
- const privateJWK = await exportJWK(privateKey);
75
- const response = await fetch(`${baseUrl}/v1/agents/bootstrap`, {
76
- method: "POST",
77
- headers: { "Content-Type": "application/json" },
78
- body: JSON.stringify({
79
- bootstrapSecret: bootstrapSecret.trim(),
80
- publicKey: publicJWK,
81
- }),
82
- signal: AbortSignal.timeout(10_000),
83
- });
84
- if (!response.ok) {
85
- const body = await response.text().catch(() => "");
86
- throw new Error(`Bootstrap failed (${response.status}): ${body || "check that the secret is valid and not expired"}`);
87
- }
88
- const result = (await response.json());
89
- return { ...result, privateKey: privateJWK };
90
- }
91
- async function fetchCapabilities(baseUrl, token) {
92
- const response = await fetch(`${baseUrl}/v1/capabilities/me`, {
93
- method: "GET",
94
- headers: { Authorization: `Bearer ${token}` },
95
- signal: AbortSignal.timeout(5_000),
96
- });
97
- if (!response.ok) {
98
- throw new Error(`Capabilities fetch failed (${response.status})`);
99
- }
100
- const body = (await response.json());
101
- return body.activeConnections ?? [];
102
- }
103
- // ---------------------------------------------------------------------------
104
- // Service mapping
105
- // ---------------------------------------------------------------------------
106
- const SUPPORTED_SERVICES = {
107
- telegram: "telegram",
108
- slack: "slack",
109
- "microsoft-teams": "msteams",
110
- "anthropic-messages": "anthropic",
111
- openai: "openai",
112
- gemini: "gemini",
113
- };
114
- function integrationLabel(conn) {
115
- if (conn.category === "llm")
116
- return "LLM proxy";
117
- if (conn.credentialType === "bot_token")
118
- return "brokered API proxy";
119
- if (conn.credentialType === "oauth")
120
- return "brokered API proxy";
121
- return "auth managed";
122
- }
123
- // ---------------------------------------------------------------------------
124
- // Config output builder
125
- // ---------------------------------------------------------------------------
126
- export function buildConfigOutput(params) {
127
- return {
128
- plugins: {
129
- enabled: true,
130
- allow: ["agenthifive"],
131
- load: {
132
- paths: ["@agenthifive/openclaw"],
133
- },
134
- entries: {
135
- agenthifive: {
136
- enabled: true,
137
- hooks: { allowPromptInjection: true },
138
- config: {
139
- baseUrl: params.baseUrl,
140
- auth: {
141
- mode: "agent",
142
- agentId: params.agentId,
143
- privateKey: Buffer.from(JSON.stringify(params.privateKey)).toString("base64"),
144
- },
145
- connectedProviders: params.connectedProviders,
146
- proxiedProviders: params.proxiedProviders,
147
- },
148
- },
149
- },
150
- },
151
- };
152
- }
153
- // ---------------------------------------------------------------------------
154
- // Main wizard
155
- // ---------------------------------------------------------------------------
156
- export async function runSetupWizard(opts = {}) {
157
- const log = (msg) => process.stdout.write(`${msg}\n`);
158
- log("");
159
- log(" AgentHiFive Vault Setup");
160
- log(" " + "=".repeat(40));
161
- log("");
162
- // Step 0: Ensure OpenClaw is onboarded
163
- ensureOnboarded(log);
164
- // Step 1: Base URL
165
- let baseUrl = opts.baseUrl;
166
- if (!baseUrl) {
167
- if (opts.nonInteractive) {
168
- throw new Error("--base-url is required in non-interactive mode");
169
- }
170
- baseUrl = await prompt("AgentHiFive base URL", "https://app.agenthifive.com");
171
- }
172
- baseUrl = baseUrl.replace(/\/+$/, "");
173
- // Step 2: Bootstrap secret
174
- let bootstrapSecret = opts.bootstrapSecret;
175
- if (!bootstrapSecret) {
176
- if (opts.nonInteractive) {
177
- throw new Error("--bootstrap-secret is required in non-interactive mode");
178
- }
179
- log("");
180
- log(" Generate a bootstrap secret from the AgentHiFive dashboard:");
181
- log(" Dashboard -> Agents -> [your agent] -> Bootstrap Secret");
182
- log(" The secret expires in 1 hour.");
183
- log("");
184
- bootstrapSecret = await prompt("Bootstrap secret (ah5b_...)");
185
- }
186
- if (!bootstrapSecret.startsWith("ah5b_")) {
187
- throw new Error("Bootstrap secrets must start with ah5b_");
188
- }
189
- // Step 3: Bootstrap — generate key pair + register
190
- log("");
191
- log(" Bootstrapping agent...");
192
- const { agentId, name, status, privateKey } = await bootstrapAgent(baseUrl, bootstrapSecret);
193
- log(` Agent "${name}" bootstrapped (${agentId.slice(0, 8)}..., status: ${status})`);
194
- // Step 4: Verify token exchange
195
- log(" Verifying token exchange...");
196
- const tokenManager = new VaultTokenManager({
197
- baseUrl,
198
- agentId,
199
- privateKey,
200
- tokenAudience: baseUrl,
201
- });
202
- try {
203
- await tokenManager.init();
204
- log(" Token exchange successful");
205
- }
206
- catch (err) {
207
- log(` WARNING: Token exchange failed: ${err instanceof Error ? err.message : String(err)}`);
208
- log(" Config will still be generated — you may need to fix auth settings.");
209
- tokenManager.stop();
210
- outputMinimalConfig(log, baseUrl, agentId, privateKey);
211
- return;
212
- }
213
- // Step 5: Fetch capabilities
214
- log(" Fetching capabilities...");
215
- let vaultConnections = [];
216
- try {
217
- vaultConnections = await fetchCapabilities(baseUrl, tokenManager.getToken());
218
- }
219
- catch (err) {
220
- log(` WARNING: Could not fetch capabilities: ${err instanceof Error ? err.message : String(err)}`);
221
- }
222
- tokenManager.stop();
223
- // Step 6: Show connection status
224
- const connections = {};
225
- const connectedProviders = [];
226
- const proxiedProviders = [];
227
- const seenServices = new Set();
228
- log("");
229
- log(" Connected Services:");
230
- log(" " + "-".repeat(50));
231
- for (const conn of vaultConnections) {
232
- const openclawName = SUPPORTED_SERVICES[conn.service] ?? conn.service;
233
- connections[openclawName] = conn.connectionId ?? "vault-managed";
234
- if (seenServices.has(conn.service))
235
- continue;
236
- seenServices.add(conn.service);
237
- const displayLabel = conn.displayName || openclawName;
238
- log(` + ${displayLabel.padEnd(20)} - connected (${integrationLabel(conn)})`);
239
- connectedProviders.push(openclawName);
240
- if (conn.category === "llm") {
241
- proxiedProviders.push(openclawName);
242
- }
243
- }
244
- // Show missing services
245
- for (const [serviceId, openclawName] of Object.entries(SUPPORTED_SERVICES)) {
246
- if (!seenServices.has(serviceId)) {
247
- log(` - ${openclawName.padEnd(20)} - not connected`);
248
- }
249
- }
250
- if (vaultConnections.length === 0) {
251
- log(" No connections found. Add connections in the AgentHiFive dashboard.");
252
- }
253
- // Step 7: Build config block
254
- const configBlock = buildConfigOutput({
255
- baseUrl,
256
- agentId,
257
- privateKey,
258
- connections,
259
- connectedProviders,
260
- proxiedProviders,
261
- });
262
- // Step 8: Write config to openclaw.json
263
- log("");
264
- let configPath = opts.configPath ?? resolveOpenClawConfigPath();
265
- if (!configPath && !opts.nonInteractive) {
266
- const suggested = defaultConfigPath();
267
- configPath = await prompt(" OpenClaw config path", suggested);
268
- if (!configPath)
269
- configPath = null;
270
- }
271
- if (configPath) {
272
- try {
273
- const existing = readExistingConfig(configPath);
274
- const merged = mergePluginConfig(existing, configBlock);
275
- mkdirSync(path.dirname(configPath), { recursive: true });
276
- writeFileSync(configPath, JSON.stringify(merged, null, 2) + "\n", "utf-8");
277
- log(` Config written to: ${configPath}`);
278
- log("");
279
- log(" Plugin config (agenthifive):");
280
- log(" " + "-".repeat(40));
281
- const ah5Entry = configBlock.plugins;
282
- const entries = ah5Entry.entries;
283
- const lines = JSON.stringify(entries.agenthifive, null, 2).split("\n");
284
- for (const line of lines) {
285
- log(` ${line}`);
286
- }
287
- }
288
- catch (err) {
289
- log(` WARNING: Could not write config: ${err instanceof Error ? err.message : String(err)}`);
290
- log("");
291
- log(" Add this to your openclaw.json manually:");
292
- log(JSON.stringify(configBlock, null, 2));
293
- }
294
- }
295
- else {
296
- log(" Could not determine config path.");
297
- log(" Add this to your openclaw.json manually:");
298
- log("");
299
- log(JSON.stringify(configBlock, null, 2));
300
- }
301
- log("");
302
- // Step 9: Auto-apply credential proxying patch
303
- log(" " + "-".repeat(50));
304
- log(" Applying credential proxying patch...");
305
- let openclawInstall = opts.openclawDir
306
- ? validateOpenClawDir(opts.openclawDir)
307
- : findOpenClawInstallDir();
308
- if (!openclawInstall && !opts.nonInteractive) {
309
- const userPath = await prompt(" OpenClaw installation path (press Enter to skip)");
310
- if (userPath) {
311
- openclawInstall = validateOpenClawDir(userPath);
312
- if (!openclawInstall) {
313
- log(` WARNING: "${userPath}" does not appear to be an OpenClaw installation.`);
314
- }
315
- }
316
- }
317
- if (openclawInstall) {
318
- try {
319
- const result = applyPatch(openclawInstall);
320
- if (result.applied) {
321
- log(` ${result.message}`);
322
- }
323
- else {
324
- log(` WARNING: ${result.message}`);
325
- logManualPatchInstructions(log);
326
- }
327
- }
328
- catch (err) {
329
- const msg = err instanceof Error ? err.message : String(err);
330
- if (msg.includes("EACCES") || msg.includes("permission denied")) {
331
- log(" ERROR: Permission denied. Try running with sudo:");
332
- log(" sudo openclaw setup-vault ...");
333
- }
334
- else {
335
- log(` WARNING: Auto-patch failed: ${msg}`);
336
- }
337
- logManualPatchInstructions(log);
338
- }
339
- }
340
- else {
341
- if (!opts.nonInteractive) {
342
- log(" Could not find OpenClaw installation. Skipping auto-patch.");
343
- }
344
- logManualPatchInstructions(log);
345
- }
346
- log("");
347
- log(" Setup complete!");
348
- log("");
349
- }
350
- // ---------------------------------------------------------------------------
351
- // Fallback: minimal config when token exchange fails
352
- // ---------------------------------------------------------------------------
353
- function outputMinimalConfig(log, baseUrl, agentId, privateKey) {
354
- const configBlock = buildConfigOutput({
355
- baseUrl,
356
- agentId,
357
- privateKey,
358
- connections: {},
359
- connectedProviders: [],
360
- proxiedProviders: [],
361
- });
362
- log("");
363
- log(" " + "=".repeat(50));
364
- log(" Add this to your openclaw.json:");
365
- log(" (capabilities could not be fetched - update manually)");
366
- log(" " + "=".repeat(50));
367
- log("");
368
- log(JSON.stringify(configBlock, null, 2));
369
- log("");
370
- }
371
- // ---------------------------------------------------------------------------
372
- // Manual patch instructions (shown when auto-patch fails)
373
- // ---------------------------------------------------------------------------
374
- function logManualPatchInstructions(log) {
375
- log("");
376
- log(" To apply the patch manually, see:");
377
- log(" node_modules/@agenthifive/openclaw/patches/README.md");
378
- }
379
- // ---------------------------------------------------------------------------
380
- // CLI argument parser (for non-interactive mode)
381
- // ---------------------------------------------------------------------------
382
- export function parseSetupArgs(args) {
383
- const opts = {};
384
- for (let i = 0; i < args.length; i++) {
385
- const arg = args[i];
386
- if (arg === "--base-url" && args[i + 1]) {
387
- const val = args[++i];
388
- if (val)
389
- opts.baseUrl = val;
390
- }
391
- else if (arg === "--bootstrap-secret" && args[i + 1]) {
392
- const val = args[++i];
393
- if (val)
394
- opts.bootstrapSecret = val;
395
- }
396
- else if (arg === "--config-path" && args[i + 1]) {
397
- const val = args[++i];
398
- if (val)
399
- opts.configPath = val;
400
- }
401
- else if (arg === "--openclaw-dir" && args[i + 1]) {
402
- const val = args[++i];
403
- if (val)
404
- opts.openclawDir = val;
405
- }
406
- else if (arg === "--non-interactive") {
407
- opts.nonInteractive = true;
408
- }
409
- }
410
- // Auto-enable non-interactive if both required args are provided
411
- if (opts.baseUrl && opts.bootstrapSecret) {
412
- opts.nonInteractive = true;
413
- }
414
- return opts;
415
- }
416
- //# sourceMappingURL=setup-wizard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"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"}