@wooblaymcp/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/dist/adapters/openclaw.d.ts +32 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +102 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/registry.d.ts +7 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +17 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +40 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/commands/deploy.d.ts +25 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +230 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +5 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +29 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/disable.d.ts +8 -0
- package/dist/commands/disable.d.ts.map +1 -0
- package/dist/commands/disable.js +81 -0
- package/dist/commands/disable.js.map +1 -0
- package/dist/commands/enable.d.ts +14 -0
- package/dist/commands/enable.d.ts.map +1 -0
- package/dist/commands/enable.js +178 -0
- package/dist/commands/enable.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +36 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/setup.d.ts +8 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +183 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +33 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config/keys.d.ts +15 -0
- package/dist/config/keys.d.ts.map +1 -0
- package/dist/config/keys.js +30 -0
- package/dist/config/keys.js.map +1 -0
- package/dist/config/paths.d.ts +7 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +9 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, copyFileSync, rmSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
/**
|
|
7
|
+
* Disable Wooblay supervision for a specific agent framework.
|
|
8
|
+
*
|
|
9
|
+
* For OpenClaw: restores config backup and removes the plugin.
|
|
10
|
+
* For MCP/Generic: prints instructions.
|
|
11
|
+
*/
|
|
12
|
+
export async function disable(framework) {
|
|
13
|
+
switch (framework.toLowerCase()) {
|
|
14
|
+
case 'openclaw':
|
|
15
|
+
return disableOpenClaw();
|
|
16
|
+
case 'mcp':
|
|
17
|
+
return disableMcp();
|
|
18
|
+
case 'generic':
|
|
19
|
+
case 'http':
|
|
20
|
+
return disableGeneric();
|
|
21
|
+
default:
|
|
22
|
+
console.log(chalk.red(`\n Unknown framework: "${framework}"\n`));
|
|
23
|
+
console.log(chalk.gray(' Supported frameworks: openclaw, mcp, generic'));
|
|
24
|
+
console.log();
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function disableOpenClaw() {
|
|
29
|
+
console.log(chalk.bold.yellow('\n Disabling Wooblay for OpenClaw\n'));
|
|
30
|
+
const openclawHome = join(homedir(), '.openclaw');
|
|
31
|
+
const openclawConfig = join(openclawHome, 'openclaw.json');
|
|
32
|
+
const backupPath = `${openclawConfig}.wooblay-backup`;
|
|
33
|
+
// 1. Restore config backup if available
|
|
34
|
+
if (existsSync(backupPath)) {
|
|
35
|
+
copyFileSync(backupPath, openclawConfig);
|
|
36
|
+
console.log(chalk.green(' ✓ Config restored from backup'));
|
|
37
|
+
}
|
|
38
|
+
else if (existsSync(openclawConfig)) {
|
|
39
|
+
// Remove Wooblay plugin entry from config
|
|
40
|
+
try {
|
|
41
|
+
const config = JSON.parse(readFileSync(openclawConfig, 'utf-8'));
|
|
42
|
+
if (config.plugins?.entries?.wooblay) {
|
|
43
|
+
delete config.plugins.entries.wooblay;
|
|
44
|
+
writeFileSync(openclawConfig, JSON.stringify(config, null, 2), 'utf-8');
|
|
45
|
+
console.log(chalk.green(' ✓ Removed Wooblay plugin from config'));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
console.log(chalk.yellow(' ⚠ Could not update config'));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 2. Remove the plugin extension directory
|
|
53
|
+
const extensionsDir = join(openclawHome, 'extensions', 'wooblay');
|
|
54
|
+
if (existsSync(extensionsDir)) {
|
|
55
|
+
rmSync(extensionsDir, { recursive: true, force: true });
|
|
56
|
+
console.log(chalk.green(' ✓ Removed plugin from ~/.openclaw/extensions/wooblay'));
|
|
57
|
+
}
|
|
58
|
+
// 3. Try to restart gateway
|
|
59
|
+
console.log(chalk.gray(' → Attempting to restart OpenClaw gateway...'));
|
|
60
|
+
try {
|
|
61
|
+
execSync('openclaw gateway restart', { stdio: 'pipe', timeout: 10_000 });
|
|
62
|
+
console.log(chalk.green(' ✓ Gateway restarted'));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
console.log(chalk.yellow(' ⚠ Could not restart gateway automatically.'));
|
|
66
|
+
console.log(chalk.gray(' Please restart manually: openclaw gateway restart'));
|
|
67
|
+
}
|
|
68
|
+
console.log(chalk.bold.green('\n ✓ Wooblay supervision disabled for OpenClaw.\n'));
|
|
69
|
+
}
|
|
70
|
+
async function disableMcp() {
|
|
71
|
+
console.log(chalk.bold.yellow('\n Disabling Wooblay MCP Tool Host\n'));
|
|
72
|
+
console.log(chalk.gray(' Stop the MCP Tool Host process:'));
|
|
73
|
+
console.log(chalk.cyan(' pkill -f "@wooblay/toolhost"'));
|
|
74
|
+
console.log(chalk.gray(' Or press Ctrl+C in the terminal running the Tool Host.\n'));
|
|
75
|
+
}
|
|
76
|
+
async function disableGeneric() {
|
|
77
|
+
console.log(chalk.bold.yellow('\n Disabling Wooblay HTTP SDK Integration\n'));
|
|
78
|
+
console.log(chalk.gray(' Remove the Wooblay API calls from your agent code.'));
|
|
79
|
+
console.log(chalk.gray(' No cleanup required on the Wooblay side.\n'));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=disable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disable.js","sourceRoot":"","sources":["../../src/commands/disable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface EnableOptions {
|
|
2
|
+
gateUrl?: string;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Enable Wooblay supervision for a specific agent framework.
|
|
6
|
+
*
|
|
7
|
+
* Supported modes:
|
|
8
|
+
* openclaw - Install the Wooblay plugin into a local OpenClaw instance
|
|
9
|
+
* mcp - Start the MCP Tool Host sidecar
|
|
10
|
+
* generic - Print HTTP SDK integration instructions
|
|
11
|
+
*/
|
|
12
|
+
export declare function enable(framework: string, opts?: EnableOptions): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=enable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../src/commands/enable.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBnF"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
const GATE_URL_DEFAULT = 'http://localhost:4800';
|
|
7
|
+
/**
|
|
8
|
+
* Enable Wooblay supervision for a specific agent framework.
|
|
9
|
+
*
|
|
10
|
+
* Supported modes:
|
|
11
|
+
* openclaw - Install the Wooblay plugin into a local OpenClaw instance
|
|
12
|
+
* mcp - Start the MCP Tool Host sidecar
|
|
13
|
+
* generic - Print HTTP SDK integration instructions
|
|
14
|
+
*/
|
|
15
|
+
export async function enable(framework, opts) {
|
|
16
|
+
const gateUrl = opts?.gateUrl ?? GATE_URL_DEFAULT;
|
|
17
|
+
switch (framework.toLowerCase()) {
|
|
18
|
+
case 'openclaw':
|
|
19
|
+
return enableOpenClaw(gateUrl);
|
|
20
|
+
case 'mcp':
|
|
21
|
+
return enableMcp(gateUrl);
|
|
22
|
+
case 'generic':
|
|
23
|
+
case 'http':
|
|
24
|
+
return enableGeneric(gateUrl);
|
|
25
|
+
default:
|
|
26
|
+
console.log(chalk.red(`\n Unknown framework: "${framework}"\n`));
|
|
27
|
+
console.log(chalk.gray(' Supported frameworks:'));
|
|
28
|
+
console.log(chalk.white(' openclaw') + chalk.gray(' — Native plugin (before_tool_call hooks)'));
|
|
29
|
+
console.log(chalk.white(' mcp') + chalk.gray(' — MCP Tool Host sidecar'));
|
|
30
|
+
console.log(chalk.white(' generic') + chalk.gray(' — HTTP SDK integration docs'));
|
|
31
|
+
console.log();
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// ─── OpenClaw ────────────────────────────────────────────────────────────────
|
|
36
|
+
async function enableOpenClaw(gateUrl) {
|
|
37
|
+
console.log(chalk.bold.cyan('\n Enabling Wooblay for OpenClaw\n'));
|
|
38
|
+
// 1. Detect OpenClaw installation
|
|
39
|
+
const openclawHome = join(homedir(), '.openclaw');
|
|
40
|
+
const openclawConfig = join(openclawHome, 'openclaw.json');
|
|
41
|
+
if (!existsSync(openclawHome)) {
|
|
42
|
+
console.log(chalk.red(' ✗ OpenClaw not found at ~/.openclaw'));
|
|
43
|
+
console.log(chalk.gray(' Install OpenClaw first: https://docs.openclaw.ai/install'));
|
|
44
|
+
console.log(chalk.gray(' Or use "wooblay provision" for a managed Runtime instance.\n'));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
console.log(chalk.green(' ✓ OpenClaw detected at ~/.openclaw'));
|
|
48
|
+
// 2. Back up existing config
|
|
49
|
+
if (existsSync(openclawConfig)) {
|
|
50
|
+
const backupPath = `${openclawConfig}.wooblay-backup`;
|
|
51
|
+
copyFileSync(openclawConfig, backupPath);
|
|
52
|
+
console.log(chalk.green(` ✓ Config backed up to ${backupPath}`));
|
|
53
|
+
}
|
|
54
|
+
// 3. Install the Wooblay plugin into extensions
|
|
55
|
+
const extensionsDir = join(openclawHome, 'extensions', 'wooblay');
|
|
56
|
+
const adapterPkgDir = findAdapterPackage();
|
|
57
|
+
if (adapterPkgDir) {
|
|
58
|
+
// Copy from local monorepo (development mode)
|
|
59
|
+
mkdirSync(extensionsDir, { recursive: true });
|
|
60
|
+
console.log(chalk.gray(` → Copying plugin from ${adapterPkgDir}...`));
|
|
61
|
+
try {
|
|
62
|
+
execSync(`cp -r "${adapterPkgDir}/"* "${extensionsDir}/"`, { stdio: 'pipe' });
|
|
63
|
+
console.log(chalk.green(' ✓ Plugin installed to ~/.openclaw/extensions/wooblay'));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
console.log(chalk.yellow(' ⚠ Could not copy plugin files. Trying npm install...'));
|
|
67
|
+
tryNpmInstall(extensionsDir);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Install from npm (production mode)
|
|
72
|
+
tryNpmInstall(extensionsDir);
|
|
73
|
+
}
|
|
74
|
+
// 4. Update OpenClaw config to enable the plugin
|
|
75
|
+
const config = existsSync(openclawConfig)
|
|
76
|
+
? JSON.parse(readFileSync(openclawConfig, 'utf-8'))
|
|
77
|
+
: {};
|
|
78
|
+
if (!config.plugins)
|
|
79
|
+
config.plugins = {};
|
|
80
|
+
config.plugins.enabled = true;
|
|
81
|
+
if (!config.plugins.entries)
|
|
82
|
+
config.plugins.entries = {};
|
|
83
|
+
config.plugins.entries.wooblay = {
|
|
84
|
+
enabled: true,
|
|
85
|
+
config: {
|
|
86
|
+
gateUrl,
|
|
87
|
+
toolFilter: 'risky',
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
writeFileSync(openclawConfig, JSON.stringify(config, null, 2), 'utf-8');
|
|
91
|
+
console.log(chalk.green(' ✓ OpenClaw config updated with Wooblay plugin'));
|
|
92
|
+
// 5. Try to restart the gateway
|
|
93
|
+
console.log(chalk.gray(' → Attempting to restart OpenClaw gateway...'));
|
|
94
|
+
try {
|
|
95
|
+
execSync('openclaw gateway restart', { stdio: 'pipe', timeout: 10_000 });
|
|
96
|
+
console.log(chalk.green(' ✓ Gateway restarted'));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
console.log(chalk.yellow(' ⚠ Could not restart gateway automatically.'));
|
|
100
|
+
console.log(chalk.gray(' Please restart manually: openclaw gateway restart'));
|
|
101
|
+
}
|
|
102
|
+
console.log(chalk.bold.green('\n ✓ Wooblay supervision enabled for OpenClaw!'));
|
|
103
|
+
console.log(chalk.gray(` Gate URL: ${gateUrl}`));
|
|
104
|
+
console.log(chalk.gray(' Integration: Native plugin (before_tool_call / after_tool_call)'));
|
|
105
|
+
console.log(chalk.gray(' All risky tool calls will be routed through Wooblay Gate.'));
|
|
106
|
+
console.log(chalk.gray(' Open the dashboard: http://localhost:5173\n'));
|
|
107
|
+
}
|
|
108
|
+
// ─── MCP ─────────────────────────────────────────────────────────────────────
|
|
109
|
+
async function enableMcp(gateUrl) {
|
|
110
|
+
console.log(chalk.bold.cyan('\n Enabling Wooblay MCP Tool Host\n'));
|
|
111
|
+
console.log(chalk.gray(' The MCP Tool Host exposes wooblay_exec, wooblay_browser, and'));
|
|
112
|
+
console.log(chalk.gray(' wooblay_http tools via the Model Context Protocol (stdio transport).'));
|
|
113
|
+
console.log(chalk.gray(' Any MCP-compatible agent can use these tools.\n'));
|
|
114
|
+
console.log(chalk.white(' Start the Tool Host:'));
|
|
115
|
+
console.log(chalk.cyan(' pnpm --filter @wooblay/toolhost dev'));
|
|
116
|
+
console.log();
|
|
117
|
+
console.log(chalk.white(' Configure your MCP client to connect:'));
|
|
118
|
+
console.log(chalk.gray(' Transport: stdio'));
|
|
119
|
+
console.log(chalk.gray(` Gate URL: ${gateUrl}`));
|
|
120
|
+
console.log(chalk.gray(' Tools: wooblay_exec, wooblay_browser, wooblay_http'));
|
|
121
|
+
console.log();
|
|
122
|
+
console.log(chalk.gray(' See: https://docs.wooblay.run/integrations/mcp\n'));
|
|
123
|
+
}
|
|
124
|
+
// ─── Generic HTTP ────────────────────────────────────────────────────────────
|
|
125
|
+
async function enableGeneric(gateUrl) {
|
|
126
|
+
console.log(chalk.bold.cyan('\n Wooblay HTTP SDK Integration\n'));
|
|
127
|
+
console.log(chalk.gray(' Any agent framework can integrate with Wooblay by calling'));
|
|
128
|
+
console.log(chalk.gray(' the Gate REST API directly.\n'));
|
|
129
|
+
console.log(chalk.white(' Endpoint:'));
|
|
130
|
+
console.log(chalk.cyan(` POST ${gateUrl}/api/tool/execute`));
|
|
131
|
+
console.log();
|
|
132
|
+
console.log(chalk.white(' Request body:'));
|
|
133
|
+
console.log(chalk.gray(` {`));
|
|
134
|
+
console.log(chalk.gray(` "toolName": "exec",`));
|
|
135
|
+
console.log(chalk.gray(` "args": { "command": "ls -la" },`));
|
|
136
|
+
console.log(chalk.gray(` "agentPubkey": "<your-ed25519-pubkey>",`));
|
|
137
|
+
console.log(chalk.gray(` "requestSignature": "<ed25519-signature>",`));
|
|
138
|
+
console.log(chalk.gray(` "adapter": "http-sdk"`));
|
|
139
|
+
console.log(chalk.gray(` }`));
|
|
140
|
+
console.log();
|
|
141
|
+
console.log(chalk.white(' Response:'));
|
|
142
|
+
console.log(chalk.gray(` { "decision": "EXECUTE"|"DENY"|"PENDING_APPROVAL", ... }`));
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.white(' Generate signing keys:'));
|
|
145
|
+
console.log(chalk.cyan(' wooblay init'));
|
|
146
|
+
console.log();
|
|
147
|
+
console.log(chalk.gray(' See: https://docs.wooblay.run/integrations/http-sdk\n'));
|
|
148
|
+
}
|
|
149
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
150
|
+
function findAdapterPackage() {
|
|
151
|
+
// Look for the adapter in the monorepo (development mode)
|
|
152
|
+
const candidates = [
|
|
153
|
+
join(process.cwd(), 'packages', 'adapters', 'openclaw'),
|
|
154
|
+
join(process.cwd(), '..', 'packages', 'adapters', 'openclaw'),
|
|
155
|
+
];
|
|
156
|
+
for (const dir of candidates) {
|
|
157
|
+
if (existsSync(join(dir, 'package.json')) && existsSync(join(dir, 'openclaw.plugin.json'))) {
|
|
158
|
+
return dir;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
function tryNpmInstall(extensionsDir) {
|
|
164
|
+
try {
|
|
165
|
+
mkdirSync(extensionsDir, { recursive: true });
|
|
166
|
+
execSync('openclaw plugins install @wooblay/openclaw-adapter', {
|
|
167
|
+
stdio: 'pipe',
|
|
168
|
+
timeout: 60_000,
|
|
169
|
+
});
|
|
170
|
+
console.log(chalk.green(' ✓ Plugin installed via openclaw plugins'));
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
console.log(chalk.yellow(' ⚠ Could not install plugin via npm.'));
|
|
174
|
+
console.log(chalk.gray(' You may need to install manually:'));
|
|
175
|
+
console.log(chalk.gray(' openclaw plugins install @wooblay/openclaw-adapter'));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=enable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../src/commands/enable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAoC1C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { mkdirSync } from 'node:fs';
|
|
3
|
+
import { generateKeyPair, storeKeyPair } from '@wooblay/crypto';
|
|
4
|
+
import { KEYS_DIR } from '../config/paths.js';
|
|
5
|
+
export async function init() {
|
|
6
|
+
console.log(chalk.bold.cyan('\n⚡ Wooblay – Local Dev Init\n'));
|
|
7
|
+
// ── Step 1: Create directories ─────────────────────────────────────
|
|
8
|
+
mkdirSync(KEYS_DIR, { recursive: true });
|
|
9
|
+
console.log(chalk.green(` ✓ Created ${KEYS_DIR}`));
|
|
10
|
+
// ── Step 2: Generate server keypair ────────────────────────────────
|
|
11
|
+
console.log(chalk.yellow('\n→ Generating server signing keypair...'));
|
|
12
|
+
const serverKeys = generateKeyPair();
|
|
13
|
+
storeKeyPair(KEYS_DIR, 'server', serverKeys);
|
|
14
|
+
console.log(chalk.green(' ✓ Server keypair stored'));
|
|
15
|
+
console.log(chalk.gray(` Public: ${KEYS_DIR}/server.pub`));
|
|
16
|
+
console.log(chalk.gray(` Private: ${KEYS_DIR}/server.key`));
|
|
17
|
+
// ── Step 3: Generate toolhost keypair ──────────────────────────────
|
|
18
|
+
console.log(chalk.yellow('\n→ Generating toolhost signing keypair...'));
|
|
19
|
+
const toolhostKeys = generateKeyPair();
|
|
20
|
+
storeKeyPair(KEYS_DIR, 'toolhost', toolhostKeys);
|
|
21
|
+
console.log(chalk.green(' ✓ Toolhost keypair stored'));
|
|
22
|
+
console.log(chalk.gray(` Public: ${KEYS_DIR}/toolhost.pub`));
|
|
23
|
+
console.log(chalk.gray(` Private: ${KEYS_DIR}/toolhost.key`));
|
|
24
|
+
// ── Step 4: Environment variable instructions ──────────────────────
|
|
25
|
+
console.log(chalk.yellow('\n→ Set the following environment variables:\n'));
|
|
26
|
+
console.log(chalk.white(` export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/wooblay_dev"`));
|
|
27
|
+
console.log(chalk.white(` export SERVER_SIGNING_PUBLIC_KEY="${serverKeys.publicKey}"`));
|
|
28
|
+
console.log(chalk.white(` export SERVER_SIGNING_PRIVATE_KEY="${serverKeys.privateKey}"`));
|
|
29
|
+
console.log(chalk.white(` export TOOLHOST_SIGNING_PUBLIC_KEY="${toolhostKeys.publicKey}"`));
|
|
30
|
+
console.log(chalk.white(` export TOOLHOST_SIGNING_PRIVATE_KEY="${toolhostKeys.privateKey}"`));
|
|
31
|
+
// ── Step 5: Database setup ─────────────────────────────────────────
|
|
32
|
+
console.log(chalk.yellow('\n→ Initialize the database:\n'));
|
|
33
|
+
console.log(chalk.white(' pnpm --filter @wooblay/gate db:push'));
|
|
34
|
+
console.log(chalk.bold.green('\n✓ Local dev environment initialized.\n'));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE/D,sEAAsE;IACtE,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEpD,sEAAsE;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;IACrC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,aAAa,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,aAAa,CAAC,CAAC,CAAC;IAE/D,sEAAsE;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,eAAe,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,eAAe,CAAC,CAAC,CAAC;IAEjE,sEAAsE;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC,CAAC;IAC9G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yCAAyC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAE/F,sEAAsE;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAQA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E7D"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir, platform } from 'node:os';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
const WOOBLAY_DASHBOARD = process.env.WOOBLAY_URL ?? 'https://app.wooblay.com';
|
|
7
|
+
export async function setup(opts) {
|
|
8
|
+
console.log(chalk.bold.cyan('\n Wooblay Setup\n'));
|
|
9
|
+
console.log(chalk.gray(' Configure all your AI agents to use Wooblay in one shot.\n'));
|
|
10
|
+
const apiKey = opts.apiKey ?? process.env.WOOBLAY_API_KEY;
|
|
11
|
+
const endpoint = opts.endpoint ?? process.env.WOOBLAY_GATE_URL ?? 'https://gate.wooblay.com';
|
|
12
|
+
const instanceId = opts.instanceId ?? process.env.WOOBLAY_INSTANCE_ID;
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
console.log(chalk.yellow(' No API key found.\n'));
|
|
15
|
+
console.log(chalk.white(' Get your API key from the Wooblay dashboard:'));
|
|
16
|
+
console.log(chalk.cyan(` ${WOOBLAY_DASHBOARD}\n`));
|
|
17
|
+
openBrowser(WOOBLAY_DASHBOARD);
|
|
18
|
+
console.log(chalk.gray(' Then run again with:'));
|
|
19
|
+
console.log(chalk.white(` npx @wooblaymcp/cli setup --api-key wbl_ak_YOUR_KEY --endpoint ${endpoint}\n`));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!apiKey.startsWith('wbl_ak_') || apiKey.length < 20) {
|
|
23
|
+
console.log(chalk.red(' Invalid API key format.'));
|
|
24
|
+
console.log(chalk.gray(' API keys start with wbl_ak_ and are at least 20 characters.\n'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (!instanceId) {
|
|
28
|
+
console.log(chalk.yellow(' No instance ID found.\n'));
|
|
29
|
+
console.log(chalk.white(' You need a proxy instance ID from the Wooblay dashboard.'));
|
|
30
|
+
console.log(chalk.gray(' Create one at Setup → Deploy Firewall, then run:'));
|
|
31
|
+
console.log(chalk.white(` npx @wooblaymcp/cli setup --api-key ${apiKey.slice(0, 12)}... --instance-id YOUR_INSTANCE_ID --endpoint ${endpoint}\n`));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
new URL(endpoint);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
console.log(chalk.red(` Invalid endpoint URL: ${endpoint}`));
|
|
39
|
+
console.log(chalk.gray(' Must be a valid URL like https://gate.wooblay.com\n'));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const sseUrl = `${endpoint.replace(/\/$/, '')}/mcp/${instanceId}/sse`;
|
|
43
|
+
console.log(chalk.gray(` Endpoint: ${sseUrl}`));
|
|
44
|
+
console.log(chalk.gray(` API Key: ${apiKey.slice(0, 12)}...${apiKey.slice(-4)}\n`));
|
|
45
|
+
const agents = detectAgents();
|
|
46
|
+
const detected = agents.filter((a) => a.detected);
|
|
47
|
+
if (detected.length === 0) {
|
|
48
|
+
console.log(chalk.yellow(' No supported agents detected on this machine.\n'));
|
|
49
|
+
console.log(chalk.gray(' Supported agents:'));
|
|
50
|
+
console.log(chalk.gray(' - Cursor (~/.cursor/mcp.json)'));
|
|
51
|
+
console.log(chalk.gray(' - Claude Desktop (platform-specific config)'));
|
|
52
|
+
console.log(chalk.gray(' - VS Code (~/.vscode/mcp.json)'));
|
|
53
|
+
console.log(chalk.gray('\n You can manually add Wooblay to any MCP-compatible agent:'));
|
|
54
|
+
printManualConfig(sseUrl, apiKey);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
console.log(chalk.white(` Detected ${detected.length} agent${detected.length > 1 ? 's' : ''}:\n`));
|
|
58
|
+
let configured = 0;
|
|
59
|
+
for (const agent of detected) {
|
|
60
|
+
const ok = configureAgent(agent, sseUrl, apiKey);
|
|
61
|
+
if (ok)
|
|
62
|
+
configured++;
|
|
63
|
+
}
|
|
64
|
+
console.log();
|
|
65
|
+
if (configured > 0) {
|
|
66
|
+
console.log(chalk.bold.green(` ${configured} agent${configured > 1 ? 's' : ''} configured.`));
|
|
67
|
+
console.log(chalk.gray(' Restart your agents for changes to take effect.\n'));
|
|
68
|
+
}
|
|
69
|
+
if (configured < detected.length) {
|
|
70
|
+
console.log(chalk.gray(' Manual config for agents that could not be auto-configured:'));
|
|
71
|
+
printManualConfig(sseUrl, apiKey);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function detectAgents() {
|
|
75
|
+
const home = homedir();
|
|
76
|
+
const os = platform();
|
|
77
|
+
const agents = [];
|
|
78
|
+
// Cursor — global config
|
|
79
|
+
const cursorPath = join(home, '.cursor', 'mcp.json');
|
|
80
|
+
agents.push({
|
|
81
|
+
name: 'Cursor',
|
|
82
|
+
configPath: cursorPath,
|
|
83
|
+
detected: existsSync(join(home, '.cursor')),
|
|
84
|
+
});
|
|
85
|
+
// Claude Desktop — OS-specific
|
|
86
|
+
let claudePath;
|
|
87
|
+
if (os === 'darwin') {
|
|
88
|
+
claudePath = join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
89
|
+
}
|
|
90
|
+
else if (os === 'win32') {
|
|
91
|
+
claudePath = join(home, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
claudePath = join(home, '.config', 'claude', 'claude_desktop_config.json');
|
|
95
|
+
}
|
|
96
|
+
const claudeDir = join(claudePath, '..');
|
|
97
|
+
agents.push({
|
|
98
|
+
name: 'Claude Desktop',
|
|
99
|
+
configPath: claudePath,
|
|
100
|
+
detected: existsSync(claudeDir) || existsSync(claudePath),
|
|
101
|
+
});
|
|
102
|
+
// VS Code — global settings (MCP in user-level mcp.json)
|
|
103
|
+
const vscodePath = join(home, '.vscode', 'mcp.json');
|
|
104
|
+
agents.push({
|
|
105
|
+
name: 'VS Code',
|
|
106
|
+
configPath: vscodePath,
|
|
107
|
+
detected: existsSync(join(home, '.vscode')),
|
|
108
|
+
});
|
|
109
|
+
return agents;
|
|
110
|
+
}
|
|
111
|
+
function configureAgent(agent, sseUrl, apiKey) {
|
|
112
|
+
try {
|
|
113
|
+
const dir = join(agent.configPath, '..');
|
|
114
|
+
mkdirSync(dir, { recursive: true });
|
|
115
|
+
let config = {};
|
|
116
|
+
if (existsSync(agent.configPath)) {
|
|
117
|
+
const raw = readFileSync(agent.configPath, 'utf-8').trim();
|
|
118
|
+
if (raw) {
|
|
119
|
+
try {
|
|
120
|
+
config = JSON.parse(raw);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
console.log(chalk.yellow(` ${agent.name}: existing config has invalid JSON — creating backup`));
|
|
124
|
+
writeFileSync(agent.configPath + '.bak', raw, 'utf-8');
|
|
125
|
+
config = {};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (!config.mcpServers)
|
|
130
|
+
config.mcpServers = {};
|
|
131
|
+
const existing = config.mcpServers.wooblay;
|
|
132
|
+
if (existing?.url === sseUrl && existing?.headers?.Authorization === `Bearer ${apiKey}`) {
|
|
133
|
+
console.log(chalk.gray(` ${agent.name}: already configured (skipped)`));
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
config.mcpServers.wooblay = {
|
|
137
|
+
url: sseUrl,
|
|
138
|
+
headers: {
|
|
139
|
+
Authorization: `Bearer ${apiKey}`,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
writeFileSync(agent.configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
143
|
+
const verb = existing ? 'updated' : 'configured';
|
|
144
|
+
console.log(chalk.green(` ${agent.name}: ${verb} at ${agent.configPath}`));
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
console.log(chalk.red(` ${agent.name}: failed — ${err.message}`));
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function printManualConfig(sseUrl, apiKey) {
|
|
153
|
+
console.log(chalk.gray('\n Add to your MCP config (mcp.json or equivalent):'));
|
|
154
|
+
console.log(chalk.white(` {`));
|
|
155
|
+
console.log(chalk.white(` "mcpServers": {`));
|
|
156
|
+
console.log(chalk.white(` "wooblay": {`));
|
|
157
|
+
console.log(chalk.white(` "url": "${sseUrl}",`));
|
|
158
|
+
console.log(chalk.white(` "headers": {`));
|
|
159
|
+
console.log(chalk.white(` "Authorization": "Bearer ${apiKey.slice(0, 12)}..."`));
|
|
160
|
+
console.log(chalk.white(` }`));
|
|
161
|
+
console.log(chalk.white(` }`));
|
|
162
|
+
console.log(chalk.white(` }`));
|
|
163
|
+
console.log(chalk.white(` }\n`));
|
|
164
|
+
}
|
|
165
|
+
function openBrowser(url) {
|
|
166
|
+
try {
|
|
167
|
+
const os = platform();
|
|
168
|
+
if (os === 'darwin') {
|
|
169
|
+
execSync(`open "${url}"`, { stdio: 'ignore' });
|
|
170
|
+
}
|
|
171
|
+
else if (os === 'win32') {
|
|
172
|
+
execSync(`start "" "${url}"`, { stdio: 'ignore' });
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
execSync(`xdg-open "${url}"`, { stdio: 'ignore' });
|
|
176
|
+
}
|
|
177
|
+
console.log(chalk.gray(` Opening ${url} in your browser...\n`));
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Browser open is best-effort
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC5D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export async function status(opts) {
|
|
3
|
+
const tenant = opts.tenant;
|
|
4
|
+
const baseUrl = tenant
|
|
5
|
+
? `https://${tenant}.wooblay.run`
|
|
6
|
+
: 'http://localhost:4800';
|
|
7
|
+
console.log(chalk.bold.cyan('\n🏥 Wooblay – Gate Health Check\n'));
|
|
8
|
+
console.log(chalk.gray(` Target: ${chalk.white(baseUrl)}`));
|
|
9
|
+
try {
|
|
10
|
+
const res = await fetch(`${baseUrl}/health`, {
|
|
11
|
+
signal: AbortSignal.timeout(5000),
|
|
12
|
+
});
|
|
13
|
+
if (!res.ok) {
|
|
14
|
+
console.log(chalk.red(`\n ✗ Gate returned HTTP ${res.status}`));
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const data = (await res.json());
|
|
19
|
+
console.log(chalk.green(`\n ✓ Gate is healthy`));
|
|
20
|
+
console.log(chalk.gray(` Status: ${chalk.white(data.status)}`));
|
|
21
|
+
console.log(chalk.gray(` Version: ${chalk.white(data.version)}`));
|
|
22
|
+
console.log(chalk.gray(` Timestamp: ${chalk.white(data.timestamp)}`));
|
|
23
|
+
console.log();
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
27
|
+
console.log(chalk.red(`\n ✗ Could not reach Gate at ${baseUrl}/health`));
|
|
28
|
+
console.log(chalk.gray(` ${message}`));
|
|
29
|
+
console.log(chalk.gray(`\n Make sure Gate is running. Try: pnpm --filter @wooblay/gate dev\n`));
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAgB;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,WAAW,MAAM,cAAc;QACjC,CAAC,CAAC,uBAAuB,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;YAC3C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,OAAO,SAAS,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type KeyPair } from '@wooblay/crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Load a named keypair from ~/.wooblay/keys/.
|
|
4
|
+
* Returns null if the keys don't exist yet.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadKeys(name: string): KeyPair | null;
|
|
7
|
+
/**
|
|
8
|
+
* Store a named keypair to ~/.wooblay/keys/ with secure permissions.
|
|
9
|
+
*/
|
|
10
|
+
export declare function saveKeys(name: string, kp: KeyPair): void;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a named keypair exists in ~/.wooblay/keys/.
|
|
13
|
+
*/
|
|
14
|
+
export declare function keysExist(name: string): boolean;
|
|
15
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/config/keys.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGlF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CASrD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI/C"}
|