@dokobot/cli 2.1.1 → 2.3.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 +31 -17
- package/dist/src/cli.js +72 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/crypto.d.ts +9 -0
- package/dist/src/crypto.js +55 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/doko.js +74 -206
- package/dist/src/doko.js.map +1 -1
- package/dist/src/envelope.d.ts +26 -0
- package/dist/src/envelope.js +43 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/install-skill.d.ts +5 -0
- package/dist/src/install-skill.js +127 -0
- package/dist/src/install-skill.js.map +1 -0
- package/dist/src/local-client.d.ts +1 -0
- package/dist/src/local-client.js.map +1 -1
- package/dist/src/server-client.d.ts +15 -21
- package/dist/src/server-client.js +23 -64
- package/dist/src/server-client.js.map +1 -1
- package/dist/src/version.js +14 -3
- package/dist/src/version.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# @dokobot/cli
|
|
2
2
|
|
|
3
|
-
Connect your Chrome browser to AI agents. Powered by [Dokobot](https://dokobot.ai).
|
|
3
|
+
Connect your Chrome browser to AI agents. Free and privacy-first. Powered by [Dokobot](https://dokobot.ai).
|
|
4
|
+
|
|
5
|
+
- **Free forever**. Local mode gives you unlimited reads with no API key, no account, no usage limits.
|
|
6
|
+
- **Privacy-first**. Local mode keeps all data on your machine. Remote mode supports end-to-end encryption so the server never sees your content in plaintext.
|
|
7
|
+
- **Works with any AI agent**. Claude Code, Codex, OpenClaw, Windsurf, or any tool that speaks MCP.
|
|
4
8
|
|
|
5
9
|
## Install
|
|
6
10
|
|
|
@@ -13,23 +17,17 @@ npm i -g @dokobot/cli
|
|
|
13
17
|
### Local mode (free, unlimited)
|
|
14
18
|
|
|
15
19
|
```bash
|
|
16
|
-
# Install
|
|
17
|
-
dokobot install-
|
|
18
|
-
|
|
19
|
-
# Read any page locally through your browser
|
|
20
|
+
dokobot install-bridge # Install native messaging bridge (one-time)
|
|
21
|
+
dokobot install-skill # Install skill for your AI agent (one-time)
|
|
20
22
|
dokobot doko read --local https://example.com
|
|
21
23
|
```
|
|
22
24
|
|
|
23
25
|
### Remote mode (cloud API)
|
|
24
26
|
|
|
25
27
|
```bash
|
|
26
|
-
# Configure your API key
|
|
27
|
-
dokobot
|
|
28
|
-
|
|
29
|
-
# Read any page via cloud API
|
|
28
|
+
dokobot config # Configure your API key
|
|
29
|
+
dokobot install-skill # Install skill for your AI agent (one-time)
|
|
30
30
|
dokobot doko read https://example.com
|
|
31
|
-
|
|
32
|
-
# Search the web
|
|
33
31
|
dokobot doko search "latest AI news"
|
|
34
32
|
```
|
|
35
33
|
|
|
@@ -101,16 +99,19 @@ dokobot doko search "latest AI news" --num 10
|
|
|
101
99
|
|--------|-------------|
|
|
102
100
|
| `--num <n>` | Number of results, 1-10 (default: 5) |
|
|
103
101
|
|
|
104
|
-
### `
|
|
102
|
+
### `install-skill`
|
|
105
103
|
|
|
106
|
-
|
|
104
|
+
Download and install the Dokobot skill for your AI agent. Auto-detects installed agents or lets you choose.
|
|
107
105
|
|
|
108
106
|
```bash
|
|
109
|
-
dokobot
|
|
110
|
-
dokobot
|
|
111
|
-
dokobot
|
|
107
|
+
dokobot install-skill # Interactive agent selection
|
|
108
|
+
dokobot install-skill --agent claude-code # Install for Claude Code
|
|
109
|
+
dokobot install-skill --agent codex # Install for Codex
|
|
110
|
+
dokobot install-skill -o ./my-skills # Custom skills directory
|
|
112
111
|
```
|
|
113
112
|
|
|
113
|
+
Supported agents: `claude-code` (or `claude`), `openclaw`, `windsurf`, `codex`.
|
|
114
|
+
|
|
114
115
|
### `doko list` / `doko remove <id>`
|
|
115
116
|
|
|
116
117
|
List or remove registered doko devices.
|
|
@@ -118,15 +119,28 @@ List or remove registered doko devices.
|
|
|
118
119
|
### Other commands
|
|
119
120
|
|
|
120
121
|
```bash
|
|
121
|
-
dokobot config # Configure API key
|
|
122
|
+
dokobot config # Configure API key, server URL, and encryption
|
|
122
123
|
dokobot update # Check for updates
|
|
123
124
|
```
|
|
124
125
|
|
|
126
|
+
## End-to-End Encryption
|
|
127
|
+
|
|
128
|
+
Remote reads support end-to-end encryption. When enabled, page content is encrypted on the server and only decrypted locally by your CLI.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
dokobot config # Set encryption password during setup
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
You can also set the password via the `DOKO_ENCRYPTION_PASSWORD` environment variable or the `--password` flag. The CLI uses scrypt key derivation with AES-256-GCM encryption.
|
|
135
|
+
|
|
136
|
+
If encryption is configured, remote `doko read` results are automatically encrypted and decrypted. The CLI will warn if the server returns unencrypted data when a key is configured, and fail fast if the encryption key doesn't match.
|
|
137
|
+
|
|
125
138
|
## Global Options
|
|
126
139
|
|
|
127
140
|
| Option | Description |
|
|
128
141
|
|--------|-------------|
|
|
129
142
|
| `--api-key <key>` | API key (or set `DOKO_API_KEY` env) |
|
|
143
|
+
| `--password <password>` | Encryption password (or set `DOKO_ENCRYPTION_PASSWORD` env) |
|
|
130
144
|
| `--server <url>` | Server URL (default: `https://dokobot.ai`) |
|
|
131
145
|
| `--verbose` | Enable verbose logging |
|
|
132
146
|
|
package/dist/src/cli.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import { input } from '@inquirer/prompts';
|
|
3
|
-
import { loadConfig, saveConfig } from './config.js';
|
|
2
|
+
import { input, password as passwordPrompt } from '@inquirer/prompts';
|
|
3
|
+
import { loadConfig, saveConfig, getServerUrl } from './config.js';
|
|
4
4
|
import { getCurrentVersion } from './version.js';
|
|
5
5
|
import { checkForUpdateNow, formatUpdateNotification } from './update-checker.js';
|
|
6
6
|
import { registerDokoCommands } from './doko.js';
|
|
7
|
+
import { ServerClient } from './server-client.js';
|
|
8
|
+
import { deriveKey, computeKeyCheck, validatePassword } from './crypto.js';
|
|
7
9
|
export function createProgram() {
|
|
8
10
|
const program = new Command();
|
|
9
11
|
program
|
|
@@ -12,10 +14,11 @@ export function createProgram() {
|
|
|
12
14
|
.version(getCurrentVersion())
|
|
13
15
|
.option('--api-key <key>', 'API key (or set DOKO_API_KEY env)')
|
|
14
16
|
.option('--server <url>', 'Server URL (default: https://dokobot.ai)')
|
|
17
|
+
.option('--password <password>', 'Encryption password (or set DOKO_ENCRYPTION_PASSWORD env)')
|
|
15
18
|
.option('--verbose', 'Enable verbose logging');
|
|
16
19
|
program
|
|
17
20
|
.command('config')
|
|
18
|
-
.description('Configure API key
|
|
21
|
+
.description('Configure API key, server URL, and encryption')
|
|
19
22
|
.action(async () => {
|
|
20
23
|
const config = loadConfig();
|
|
21
24
|
const apiKey = await input({
|
|
@@ -26,7 +29,61 @@ export function createProgram() {
|
|
|
26
29
|
message: 'Server URL:',
|
|
27
30
|
default: config.serverUrl || 'https://dokobot.ai',
|
|
28
31
|
});
|
|
29
|
-
|
|
32
|
+
let { encryptionKey, kid } = config;
|
|
33
|
+
if (encryptionKey) {
|
|
34
|
+
console.log(` E2E encryption: enabled (key version ${kid ?? 0})`);
|
|
35
|
+
}
|
|
36
|
+
let pwd = await passwordPrompt({
|
|
37
|
+
message: 'Encryption password (leave empty to skip):',
|
|
38
|
+
}).catch(() => '');
|
|
39
|
+
if (pwd && apiKey) {
|
|
40
|
+
try {
|
|
41
|
+
validatePassword(pwd);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
console.error(` ${e instanceof Error ? e.message : e}`);
|
|
45
|
+
pwd = '';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (pwd && apiKey) {
|
|
49
|
+
const client = new ServerClient(serverUrl, apiKey);
|
|
50
|
+
console.log(' Deriving encryption key...');
|
|
51
|
+
const encConfig = await client.getEncryptionConfig();
|
|
52
|
+
if (encConfig.enabled && encConfig.salt && encConfig.keyCheck) {
|
|
53
|
+
const key = await deriveKey(pwd, encConfig.salt);
|
|
54
|
+
const check = computeKeyCheck(key);
|
|
55
|
+
if (check !== encConfig.keyCheck) {
|
|
56
|
+
console.error(' \u2717 Password does not match. Encryption key not updated.');
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
encryptionKey = key.toString('base64');
|
|
60
|
+
kid = encConfig.kid;
|
|
61
|
+
console.log(' \u2713 Encryption key verified and stored.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log(' Encryption is not enabled. Set it up in the Dokobot browser extension first.');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (!pwd && apiKey) {
|
|
69
|
+
if (encryptionKey) {
|
|
70
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
71
|
+
const clear = await confirm({ message: 'Clear stored encryption key?', default: false }).catch(() => false);
|
|
72
|
+
if (clear) {
|
|
73
|
+
encryptionKey = undefined;
|
|
74
|
+
kid = undefined;
|
|
75
|
+
console.log(' Encryption key cleared.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const client = new ServerClient(serverUrl, apiKey);
|
|
80
|
+
const encConfig = await client.getEncryptionConfig();
|
|
81
|
+
if (encConfig.enabled) {
|
|
82
|
+
console.log(' \u26a0 Encryption is enabled but no local key. Enter the encryption password to decrypt remote reads.');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
saveConfig({ apiKey, serverUrl, encryptionKey, kid });
|
|
30
87
|
console.log('Configuration saved.');
|
|
31
88
|
});
|
|
32
89
|
program
|
|
@@ -51,6 +108,17 @@ export function createProgram() {
|
|
|
51
108
|
const { installBridge } = await import('./install-bridge.js');
|
|
52
109
|
await installBridge(options);
|
|
53
110
|
});
|
|
111
|
+
program
|
|
112
|
+
.command('install-skill')
|
|
113
|
+
.description('Download and install the Dokobot skill for your AI agent')
|
|
114
|
+
.option('-o, --output <path>', 'Custom skills directory (skill will be saved to <path>/doko/SKILL.md)')
|
|
115
|
+
.option('--agent <name>', 'Target agent (claude-code, openclaw, windsurf, codex)')
|
|
116
|
+
.action(async (options) => {
|
|
117
|
+
const globalOpts = program.opts();
|
|
118
|
+
const serverUrl = getServerUrl(globalOpts.server);
|
|
119
|
+
const { installSkill } = await import('./install-skill.js');
|
|
120
|
+
await installSkill({ serverUrl, outputPath: options.output, agent: options.agent });
|
|
121
|
+
});
|
|
54
122
|
registerDokoCommands(program);
|
|
55
123
|
return program;
|
|
56
124
|
}
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.d.ts
CHANGED
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type FlattenedJWE } from 'jose';
|
|
2
|
+
export declare function validatePassword(password: string): void;
|
|
3
|
+
export declare function deriveKey(password: string, saltBase64: string): Promise<Buffer>;
|
|
4
|
+
export declare function computeKeyCheck(key: Buffer): string;
|
|
5
|
+
export declare function encrypt(plaintext: Buffer, key: Buffer, kid: number): Promise<FlattenedJWE>;
|
|
6
|
+
export declare function decrypt(jwe: FlattenedJWE, key: Buffer): Promise<Buffer>;
|
|
7
|
+
export declare function generateSalt(): string;
|
|
8
|
+
export declare function isJWE(obj: unknown): obj is FlattenedJWE;
|
|
9
|
+
export type { FlattenedJWE };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { FlattenedEncrypt, flattenedDecrypt } from 'jose';
|
|
2
|
+
import scryptJs from 'scrypt-js';
|
|
3
|
+
const { scrypt } = scryptJs;
|
|
4
|
+
import { createHmac, randomBytes, webcrypto } from 'crypto';
|
|
5
|
+
const SCRYPT_N = 32768;
|
|
6
|
+
const SCRYPT_R = 8;
|
|
7
|
+
const SCRYPT_P = 1;
|
|
8
|
+
const KEY_LEN = 32;
|
|
9
|
+
const SALT_LEN = 32;
|
|
10
|
+
const HKDF_INFO = 'DokoE2E-A256GCM';
|
|
11
|
+
const MIN_PASSWORD_LENGTH = 8;
|
|
12
|
+
const HMAC_VERIFICATION_DATA = 'dokobot-verification';
|
|
13
|
+
const subtle = webcrypto.subtle;
|
|
14
|
+
export function validatePassword(password) {
|
|
15
|
+
if (password.length < MIN_PASSWORD_LENGTH) {
|
|
16
|
+
throw new Error(`Password must be at least ${MIN_PASSWORD_LENGTH} characters`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function deriveKey(password, saltBase64) {
|
|
20
|
+
const salt = Buffer.from(saltBase64, 'base64');
|
|
21
|
+
const passwordBytes = Buffer.from(password, 'utf-8');
|
|
22
|
+
const baseKey = await scrypt(passwordBytes, salt, SCRYPT_N, SCRYPT_R, SCRYPT_P, KEY_LEN);
|
|
23
|
+
const cryptoKey = await subtle.importKey('raw', baseKey, 'HKDF', false, ['deriveBits']);
|
|
24
|
+
const finalBits = await subtle.deriveBits({
|
|
25
|
+
name: 'HKDF',
|
|
26
|
+
hash: 'SHA-256',
|
|
27
|
+
salt: new Uint8Array(0),
|
|
28
|
+
info: new TextEncoder().encode(HKDF_INFO),
|
|
29
|
+
}, cryptoKey, 256);
|
|
30
|
+
return Buffer.from(finalBits);
|
|
31
|
+
}
|
|
32
|
+
export function computeKeyCheck(key) {
|
|
33
|
+
return createHmac('sha256', key).update(HMAC_VERIFICATION_DATA).digest('base64');
|
|
34
|
+
}
|
|
35
|
+
export async function encrypt(plaintext, key, kid) {
|
|
36
|
+
const secretKey = await subtle.importKey('raw', key, { name: 'AES-GCM', length: 256 }, false, ['encrypt']);
|
|
37
|
+
return new FlattenedEncrypt(plaintext)
|
|
38
|
+
.setProtectedHeader({ alg: 'dir', enc: 'A256GCM', kid: String(kid) })
|
|
39
|
+
.encrypt(secretKey);
|
|
40
|
+
}
|
|
41
|
+
export async function decrypt(jwe, key) {
|
|
42
|
+
const secretKey = await subtle.importKey('raw', key, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
|
|
43
|
+
const { plaintext } = await flattenedDecrypt(jwe, secretKey);
|
|
44
|
+
return Buffer.from(plaintext);
|
|
45
|
+
}
|
|
46
|
+
export function generateSalt() {
|
|
47
|
+
return randomBytes(SALT_LEN).toString('base64');
|
|
48
|
+
}
|
|
49
|
+
export function isJWE(obj) {
|
|
50
|
+
if (!obj || typeof obj !== 'object')
|
|
51
|
+
return false;
|
|
52
|
+
const o = obj;
|
|
53
|
+
return typeof o.protected === 'string' && typeof o.ciphertext === 'string';
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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"}
|
package/dist/src/doko.js
CHANGED
|
@@ -1,41 +1,20 @@
|
|
|
1
|
-
import { input, select } from '@inquirer/prompts';
|
|
2
|
-
import { McpClient } from './mcp-client.js';
|
|
3
1
|
import { ServerClient } from './server-client.js';
|
|
4
|
-
import {
|
|
5
|
-
import { Heartbeat } from './heartbeat.js';
|
|
6
|
-
import { Executor, DOKO_TOOLS } from './executor.js';
|
|
7
|
-
import { getApiKey, getServerUrl, loadConfig, saveConfig, saveDevice, listDevices, removeDevice, findDeviceByName, } from './config.js';
|
|
2
|
+
import { getApiKey, getServerUrl, loadConfig, listDevices, removeDevice, } from './config.js';
|
|
8
3
|
import { setLogLevel } from './logger.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
${G}███████████${R} ${D}Open the full web to AI agent${R}
|
|
20
|
-
${G}▀████████▀${R}
|
|
21
|
-
`;
|
|
4
|
+
import { deriveKey, computeKeyCheck } from './crypto.js';
|
|
5
|
+
import { isEncryptedResult, decryptResultPayload } from './envelope.js';
|
|
6
|
+
function requireApiKey(globalOpts) {
|
|
7
|
+
const apiKey = getApiKey(globalOpts.apiKey);
|
|
8
|
+
if (!apiKey) {
|
|
9
|
+
console.error('API key required for remote mode. Run `dokobot config` to set your key, or use `--local` for local mode without an API key.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
return apiKey;
|
|
13
|
+
}
|
|
22
14
|
export function registerDokoCommands(program) {
|
|
23
15
|
const doko = program
|
|
24
16
|
.command('doko')
|
|
25
17
|
.description('Manage doko devices');
|
|
26
|
-
doko
|
|
27
|
-
.command('connect')
|
|
28
|
-
.description('Connect a Chrome browser via Chrome DevTools MCP')
|
|
29
|
-
.option('--name <name>', 'Name for the doko')
|
|
30
|
-
.option('--device-id <id>', 'Reuse an existing device ID')
|
|
31
|
-
.option('--browser-url <url>', 'Connect to a running Chrome instance (e.g. http://127.0.0.1:9222)')
|
|
32
|
-
.option('--mcp-args <args>', 'Extra arguments for chrome-devtools-mcp (comma-separated)')
|
|
33
|
-
.action(async (options) => {
|
|
34
|
-
const globalOpts = program.opts();
|
|
35
|
-
if (globalOpts.verbose)
|
|
36
|
-
setLogLevel('debug');
|
|
37
|
-
await connectCommand(globalOpts, options);
|
|
38
|
-
});
|
|
39
18
|
doko
|
|
40
19
|
.command('list')
|
|
41
20
|
.description('List registered devices')
|
|
@@ -93,20 +72,51 @@ export function registerDokoCommands(program) {
|
|
|
93
72
|
result = await client.readPage(readParams);
|
|
94
73
|
}
|
|
95
74
|
else {
|
|
96
|
-
const apiKey =
|
|
97
|
-
if (!apiKey) {
|
|
98
|
-
console.error('API key required. Run `dokobot config` first.');
|
|
99
|
-
process.exit(1);
|
|
100
|
-
}
|
|
75
|
+
const apiKey = requireApiKey(globalOpts);
|
|
101
76
|
const serverUrl = getServerUrl(globalOpts.server);
|
|
102
77
|
const client = new ServerClient(serverUrl, apiKey);
|
|
103
|
-
|
|
78
|
+
const encKey = await resolveEncryptionKey(globalOpts, client);
|
|
79
|
+
const rawResult = await client.readPageRaw({ ...readParams, deviceId: options.device });
|
|
80
|
+
if (isEncryptedResult(rawResult)) {
|
|
81
|
+
if (!encKey) {
|
|
82
|
+
console.error('Error: Result is encrypted. Set DOKO_ENCRYPTION_PASSWORD or run `dokobot config` to set up encryption.');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
const content = await decryptResultPayload(rawResult, encKey);
|
|
86
|
+
if (content.title)
|
|
87
|
+
console.log(`# ${content.title}\n`);
|
|
88
|
+
console.log(content.text ?? '');
|
|
89
|
+
if (rawResult.meta.canContinue && rawResult.meta.sessionId) {
|
|
90
|
+
console.error(`\nSession: ${rawResult.meta.sessionId} (use --session-id to continue)`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (encKey) {
|
|
94
|
+
console.error('Warning: Encryption key is configured but received unencrypted result.');
|
|
95
|
+
console.error('Encryption may have been disabled on the browser extension. Verify your settings.');
|
|
96
|
+
console.error('Run `dokobot config` to clear the stored key if this is expected.');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const data = rawResult?.data;
|
|
101
|
+
const inner = (data?.data ?? data);
|
|
102
|
+
if (inner) {
|
|
103
|
+
result = {
|
|
104
|
+
title: inner.trace?.title ?? inner.title ?? '',
|
|
105
|
+
text: inner.text ?? '',
|
|
106
|
+
url: inner.trace?.url ?? inner.url ?? readParams.url,
|
|
107
|
+
sessionId: inner.sessionId,
|
|
108
|
+
canContinue: inner.canContinue,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
104
112
|
}
|
|
105
|
-
if (result
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
113
|
+
if (result) {
|
|
114
|
+
if (result.title)
|
|
115
|
+
console.log(`# ${result.title}\n`);
|
|
116
|
+
console.log(result.text);
|
|
117
|
+
if (result.canContinue && result.sessionId) {
|
|
118
|
+
console.error(`\nSession: ${result.sessionId} (use --session-id to continue)`);
|
|
119
|
+
}
|
|
110
120
|
}
|
|
111
121
|
}
|
|
112
122
|
catch (error) {
|
|
@@ -132,11 +142,7 @@ export function registerDokoCommands(program) {
|
|
|
132
142
|
await client.closeSession(sessionId);
|
|
133
143
|
}
|
|
134
144
|
else {
|
|
135
|
-
const apiKey =
|
|
136
|
-
if (!apiKey) {
|
|
137
|
-
console.error('API key required. Run `dokobot config` first.');
|
|
138
|
-
process.exit(1);
|
|
139
|
-
}
|
|
145
|
+
const apiKey = requireApiKey(globalOpts);
|
|
140
146
|
const serverUrl = getServerUrl(globalOpts.server);
|
|
141
147
|
const client = new ServerClient(serverUrl, apiKey);
|
|
142
148
|
await client.closeSession(sessionId);
|
|
@@ -156,11 +162,7 @@ export function registerDokoCommands(program) {
|
|
|
156
162
|
const globalOpts = program.opts();
|
|
157
163
|
if (globalOpts.verbose)
|
|
158
164
|
setLogLevel('debug');
|
|
159
|
-
const apiKey =
|
|
160
|
-
if (!apiKey) {
|
|
161
|
-
console.error('API key required. Run `dokobot config` first.');
|
|
162
|
-
process.exit(1);
|
|
163
|
-
}
|
|
165
|
+
const apiKey = requireApiKey(globalOpts);
|
|
164
166
|
const serverUrl = getServerUrl(globalOpts.server);
|
|
165
167
|
const client = new ServerClient(serverUrl, apiKey);
|
|
166
168
|
try {
|
|
@@ -182,162 +184,28 @@ export function registerDokoCommands(program) {
|
|
|
182
184
|
}
|
|
183
185
|
});
|
|
184
186
|
}
|
|
185
|
-
async function
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
let deviceName = options.name;
|
|
190
|
-
let apiKey = getApiKey(globalOpts.apiKey);
|
|
191
|
-
if (!apiKey) {
|
|
192
|
-
if (deviceId) {
|
|
193
|
-
const guideUrl = `${serverUrl}/guide?source=cli&deviceId=${deviceId}`;
|
|
194
|
-
console.log(` No API key found. Opening setup guide...`);
|
|
195
|
-
console.log(` ${D}${guideUrl}${R}`);
|
|
196
|
-
console.log('');
|
|
197
|
-
const { exec } = await import('child_process');
|
|
198
|
-
exec(`open "${guideUrl}"`);
|
|
199
|
-
apiKey = await input({ message: 'Paste your API key:' });
|
|
200
|
-
if (!apiKey) {
|
|
201
|
-
console.error('API key is required.');
|
|
202
|
-
process.exit(1);
|
|
203
|
-
}
|
|
204
|
-
const config = loadConfig();
|
|
205
|
-
saveConfig({ ...config, apiKey });
|
|
206
|
-
console.log(' ✓ API key saved');
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
const { randomUUID } = await import('crypto');
|
|
210
|
-
const preferredId = randomUUID();
|
|
211
|
-
const guideUrl = `${serverUrl}/guide?source=cli&deviceId=${preferredId}`;
|
|
212
|
-
console.log(` No API key found. Opening setup guide...`);
|
|
213
|
-
console.log(` ${D}${guideUrl}${R}`);
|
|
214
|
-
console.log('');
|
|
215
|
-
console.log(' Follow the guide to complete the setup.');
|
|
216
|
-
const { exec } = await import('child_process');
|
|
217
|
-
exec(`open "${guideUrl}"`);
|
|
218
|
-
process.exit(0);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
const serverClient = new ServerClient(serverUrl, apiKey);
|
|
222
|
-
if (!deviceId && deviceName) {
|
|
223
|
-
const existing = findDeviceByName(deviceName);
|
|
224
|
-
if (existing) {
|
|
225
|
-
deviceId = existing.id;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if (!deviceId && !deviceName) {
|
|
229
|
-
const devices = listDevices();
|
|
230
|
-
const choices = [
|
|
231
|
-
{ name: '+ Create new doko', value: '__new__' },
|
|
232
|
-
...devices.map(d => ({ name: `${d.name} (${d.id})`, value: d.id })),
|
|
233
|
-
];
|
|
234
|
-
const selected = await select({
|
|
235
|
-
message: 'Choose a doko:',
|
|
236
|
-
choices,
|
|
237
|
-
});
|
|
238
|
-
if (selected === '__new__') {
|
|
239
|
-
deviceName = await input({
|
|
240
|
-
message: 'Name your new doko:',
|
|
241
|
-
default: 'My Chrome',
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
deviceId = selected;
|
|
246
|
-
const existing = devices.find(d => d.id === deviceId);
|
|
247
|
-
deviceName = existing?.name;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
const mcpExtraArgs = options.mcpArgs ? options.mcpArgs.split(',') : [];
|
|
251
|
-
const mcpClient = new McpClient();
|
|
252
|
-
console.log(' Connecting to Chrome...');
|
|
253
|
-
try {
|
|
254
|
-
await mcpClient.connect({
|
|
255
|
-
browserUrl: options.browserUrl,
|
|
256
|
-
extraArgs: mcpExtraArgs,
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
catch (error) {
|
|
260
|
-
console.error('Failed to connect to Chrome DevTools MCP:', error instanceof Error ? error.message : error);
|
|
261
|
-
process.exit(1);
|
|
262
|
-
}
|
|
263
|
-
let tools;
|
|
264
|
-
try {
|
|
265
|
-
tools = await mcpClient.listTools();
|
|
187
|
+
async function resolveEncryptionKey(globalOpts, client) {
|
|
188
|
+
const config = loadConfig();
|
|
189
|
+
if (config.encryptionKey) {
|
|
190
|
+
return Buffer.from(config.encryptionKey, 'base64');
|
|
266
191
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
await
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
try {
|
|
273
|
-
const check = await mcpClient.callTool('list_pages', {});
|
|
274
|
-
if (check.isError) {
|
|
275
|
-
const msg = check.content?.[0]?.text ?? '';
|
|
276
|
-
console.error(' ✗ Chrome is not reachable.');
|
|
277
|
-
console.error('');
|
|
278
|
-
console.error(' Please enable remote debugging in Chrome:');
|
|
279
|
-
console.error(' 1. Open chrome://inspect/#remote-debugging');
|
|
280
|
-
console.error(' 2. Check "Allow remote debugging for this browser instance"');
|
|
281
|
-
console.error(' 3. Re-run this command');
|
|
282
|
-
console.error('');
|
|
283
|
-
console.error(` Detail: ${msg}`);
|
|
284
|
-
await mcpClient.disconnect();
|
|
192
|
+
const password = globalOpts.password || process.env.DOKO_ENCRYPTION_PASSWORD;
|
|
193
|
+
if (password) {
|
|
194
|
+
const encConfig = await client.getEncryptionConfig();
|
|
195
|
+
if (!encConfig.enabled) {
|
|
196
|
+
console.error('Error: Encryption password provided but encryption is not enabled on the server. Enable encryption in the extension first.');
|
|
285
197
|
process.exit(1);
|
|
286
198
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
type: 'chrome',
|
|
297
|
-
deviceId,
|
|
298
|
-
name: deviceName,
|
|
299
|
-
tools: [...tools, ...DOKO_TOOLS],
|
|
300
|
-
});
|
|
301
|
-
deviceId = result.deviceId;
|
|
302
|
-
deviceName = result.name;
|
|
303
|
-
saveDevice({
|
|
304
|
-
id: result.deviceId,
|
|
305
|
-
name: result.name,
|
|
306
|
-
type: result.type,
|
|
307
|
-
createdAt: Date.now(),
|
|
308
|
-
});
|
|
309
|
-
console.log(` ✓ Registered "${deviceName}" (${deviceId})`);
|
|
310
|
-
}
|
|
311
|
-
catch (error) {
|
|
312
|
-
console.error('Registration failed:', error instanceof Error ? error.message : error);
|
|
313
|
-
await mcpClient.disconnect();
|
|
314
|
-
process.exit(1);
|
|
315
|
-
}
|
|
316
|
-
const executor = new Executor(mcpClient, serverUrl);
|
|
317
|
-
const heartbeat = new Heartbeat(serverClient, deviceId);
|
|
318
|
-
const statusLine = ` ${G}●${R} Listening for commands... (Ctrl+C to quit)`;
|
|
319
|
-
const poller = new CommandPoller(serverClient, executor, deviceId, {
|
|
320
|
-
onReconnect: () => process.stdout.write(statusLine),
|
|
321
|
-
});
|
|
322
|
-
heartbeat.start();
|
|
323
|
-
poller.start();
|
|
324
|
-
const updateInfo = getUpdateResult();
|
|
325
|
-
if (updateInfo) {
|
|
326
|
-
console.error(formatUpdateNotification(updateInfo));
|
|
199
|
+
if (encConfig.salt) {
|
|
200
|
+
const key = await deriveKey(password, encConfig.salt);
|
|
201
|
+
const check = computeKeyCheck(key);
|
|
202
|
+
if (check !== encConfig.keyCheck) {
|
|
203
|
+
console.error('Error: Encryption password does not match. Check your password or reconfigure with `dokobot config`.');
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
return key;
|
|
207
|
+
}
|
|
327
208
|
}
|
|
328
|
-
|
|
329
|
-
process.stdout.write(statusLine);
|
|
330
|
-
const shutdown = async () => {
|
|
331
|
-
process.stdout.write(`\r\x1b[2K`);
|
|
332
|
-
console.log(' Shutting down...');
|
|
333
|
-
poller.stop();
|
|
334
|
-
heartbeat.stop();
|
|
335
|
-
await serverClient.disconnect(deviceId);
|
|
336
|
-
await mcpClient.disconnect();
|
|
337
|
-
process.exit(0);
|
|
338
|
-
};
|
|
339
|
-
process.on('SIGINT', shutdown);
|
|
340
|
-
process.on('SIGTERM', shutdown);
|
|
341
|
-
await new Promise(() => { });
|
|
209
|
+
return undefined;
|
|
342
210
|
}
|
|
343
211
|
//# sourceMappingURL=doko.js.map
|
package/dist/src/doko.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doko.js","sourceRoot":"","sources":["../../src/doko.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAC/C,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,GACxD,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAQhF,MAAM,CAAC,GAAG,UAAU,CAAC;AACrB,MAAM,CAAC,GAAG,YAAY,CAAC;AACvB,MAAM,CAAC,GAAG,SAAS,CAAC;AACpB,MAAM,CAAC,GAAG,SAAS,CAAC;AACpB,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,MAAM,MAAM,GAAG;KACV,CAAC,aAAa,CAAC;KACf,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,iBAAiB,EAAE,GAAG,CAAC;KAC9F,CAAC,cAAc,CAAC,MAAM,CAAC,gCAAgC,CAAC;KACxD,CAAC,aAAa,CAAC;CACnB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAEtC,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;SAC5C,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;SACzD,MAAM,CAAC,qBAAqB,EAAE,mEAAmE,CAAC;SAClG,MAAM,CAAC,mBAAmB,EAAE,2DAA2D,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,IAAI,UAAU,CAAC,OAAO;YAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,CAAC,EAAU,EAAE,EAAE;QACrB,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAC9D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;SACvE,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,EAAE,IAAI,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;SACxE,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAA0I,EAAE,EAAE;QACxK,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,IAAI,UAAU,CAAC,OAAO;YAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,UAAU,GAAG;YACjB,GAAG;YACH,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACpE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS;YACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS;YACvC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS;SAC1C,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,MAAM,CAAC;YACX,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBAC/D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBACjG,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnD,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3C,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,SAAS,iCAAiC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,2BAA2B,CAAC;SACpC,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAC9D,MAAM,CAAC,eAAe,EAAE,+BAA+B,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAA6C,EAAE,EAAE;QACjF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,IAAI,UAAU,CAAC,OAAO;YAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBAC/D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBACjG,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnD,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,WAAW,EAAE,sCAAsC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAyB,EAAE,EAAE;QACzD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,IAAI,UAAU,CAAC,OAAO;YAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACjG,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;gBAC/B,KAAK;gBACL,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACjD,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3B,IAAI,CAAC,CAAC,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,UAAyB,EACzB,OAAoF;IAEpF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAElD,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,IAAI,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9B,IAAI,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,SAAS,8BAA8B,QAAQ,EAAE,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC;YAC3B,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,GAAG,SAAS,8BAA8B,WAAW,EAAE,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YACzD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEzD,IAAI,CAAC,QAAQ,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG;YACd,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE;YAC/C,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACpE,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;YAC5B,OAAO,EAAE,gBAAgB;YACzB,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,GAAG,MAAM,KAAK,CAAC;gBACvB,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,QAAQ,CAAC;YACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YACtD,UAAU,GAAG,QAAQ,EAAE,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,CAAC;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,YAAY;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/G,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAyD,CAAC;QACjH,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC/D,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACjF,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;YACpC,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;YACxC,IAAI,EAAE,QAAQ;YACd,QAAQ;YACR,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC;SACjC,CAAC,CAAC;QAEH,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAEzB,UAAU,CAAC;YACT,EAAE,EAAE,MAAM,CAAC,QAAQ;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,MAAM,QAAQ,GAAG,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtF,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,YAAY,EAAE,QAAS,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAS,EAAE;QAClE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;KACpD,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;IACrC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,YAAY,CAAC,UAAU,CAAC,QAAS,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"doko.js","sourceRoot":"","sources":["../../src/doko.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type FlattenedJWE } from './crypto.js';
|
|
2
|
+
export interface EncryptionMeta {
|
|
3
|
+
success: boolean;
|
|
4
|
+
error?: string;
|
|
5
|
+
textLength: number;
|
|
6
|
+
elapsedMs?: number;
|
|
7
|
+
rounds?: number;
|
|
8
|
+
screens?: number;
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
canContinue?: boolean;
|
|
11
|
+
stopReason?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface DecryptedContent {
|
|
14
|
+
title?: string;
|
|
15
|
+
text?: string;
|
|
16
|
+
chunks?: unknown[];
|
|
17
|
+
screenshots?: string[];
|
|
18
|
+
containerTree?: unknown[];
|
|
19
|
+
}
|
|
20
|
+
export interface EncryptedResult {
|
|
21
|
+
meta: EncryptionMeta;
|
|
22
|
+
payload: FlattenedJWE;
|
|
23
|
+
}
|
|
24
|
+
export declare function isEncryptedResult(result: unknown): result is EncryptedResult;
|
|
25
|
+
export declare function buildEncryptedResult(rawResult: Record<string, unknown>, key: Buffer, kid: number): Promise<EncryptedResult>;
|
|
26
|
+
export declare function decryptResultPayload(result: EncryptedResult, key: Buffer): Promise<DecryptedContent>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { encrypt, decrypt, isJWE } from './crypto.js';
|
|
2
|
+
export function isEncryptedResult(result) {
|
|
3
|
+
if (!result || typeof result !== 'object')
|
|
4
|
+
return false;
|
|
5
|
+
const r = result;
|
|
6
|
+
return r.meta !== undefined && isJWE(r.payload);
|
|
7
|
+
}
|
|
8
|
+
export async function buildEncryptedResult(rawResult, key, kid) {
|
|
9
|
+
const innerData = extractInnerData(rawResult);
|
|
10
|
+
const meta = {
|
|
11
|
+
success: rawResult.success ?? true,
|
|
12
|
+
error: rawResult.error,
|
|
13
|
+
textLength: innerData?.text?.length ?? 0,
|
|
14
|
+
elapsedMs: innerData?.stats?.elapsedMs,
|
|
15
|
+
rounds: innerData?.stats?.rounds,
|
|
16
|
+
screens: innerData?.stats?.screens,
|
|
17
|
+
sessionId: innerData?.sessionId,
|
|
18
|
+
canContinue: innerData?.canContinue,
|
|
19
|
+
stopReason: innerData?.stats?.stopReason,
|
|
20
|
+
};
|
|
21
|
+
const sensitiveContent = {
|
|
22
|
+
title: innerData?.trace?.title,
|
|
23
|
+
text: innerData?.text,
|
|
24
|
+
chunks: innerData?.chunks,
|
|
25
|
+
screenshots: innerData?.screenshots,
|
|
26
|
+
containerTree: innerData?.containerTree,
|
|
27
|
+
};
|
|
28
|
+
const plaintext = Buffer.from(JSON.stringify(sensitiveContent));
|
|
29
|
+
const payload = await encrypt(plaintext, key, kid);
|
|
30
|
+
return { meta, payload };
|
|
31
|
+
}
|
|
32
|
+
export async function decryptResultPayload(result, key) {
|
|
33
|
+
const plaintext = await decrypt(result.payload, key);
|
|
34
|
+
return JSON.parse(plaintext.toString());
|
|
35
|
+
}
|
|
36
|
+
function extractInnerData(rawResult) {
|
|
37
|
+
const data = rawResult.data;
|
|
38
|
+
if (!data)
|
|
39
|
+
return undefined;
|
|
40
|
+
const inner = data.data;
|
|
41
|
+
return inner ?? data;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAqB,MAAM,aAAa,CAAC;AA2BzE,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,CAAC,GAAG,MAAiC,CAAC;IAC5C,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAkC,EAClC,GAAW,EACX,GAAW;IAEX,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAmB;QAC3B,OAAO,EAAG,SAAS,CAAC,OAAmB,IAAI,IAAI;QAC/C,KAAK,EAAE,SAAS,CAAC,KAA2B;QAC5C,UAAU,EAAG,SAAS,EAAE,IAAe,EAAE,MAAM,IAAI,CAAC;QACpD,SAAS,EAAG,SAAS,EAAE,KAAiC,EAAE,SAA+B;QACzF,MAAM,EAAG,SAAS,EAAE,KAAiC,EAAE,MAA4B;QACnF,OAAO,EAAG,SAAS,EAAE,KAAiC,EAAE,OAA6B;QACrF,SAAS,EAAE,SAAS,EAAE,SAA+B;QACrD,WAAW,EAAE,SAAS,EAAE,WAAkC;QAC1D,UAAU,EAAG,SAAS,EAAE,KAAiC,EAAE,UAAgC;KAC5F,CAAC;IAEF,MAAM,gBAAgB,GAAqB;QACzC,KAAK,EAAG,SAAS,EAAE,KAAiC,EAAE,KAA2B;QACjF,IAAI,EAAE,SAAS,EAAE,IAA0B;QAC3C,MAAM,EAAE,SAAS,EAAE,MAA+B;QAClD,WAAW,EAAE,SAAS,EAAE,WAAmC;QAC3D,aAAa,EAAE,SAAS,EAAE,aAAsC;KACjE,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAuB,EACvB,GAAW;IAEX,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAqB,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAkC;IAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,IAA2C,CAAC;IACnE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,IAA2C,CAAC;IAC/D,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import { select, input } from '@inquirer/prompts';
|
|
5
|
+
const SKILL_NAME = 'doko';
|
|
6
|
+
const CUSTOM_CHOICE = '__custom__';
|
|
7
|
+
function allAgents() {
|
|
8
|
+
const home = os.homedir();
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
name: 'Claude Code',
|
|
12
|
+
dir: path.join(home, '.claude', 'skills', SKILL_NAME),
|
|
13
|
+
file: 'SKILL.md',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'OpenClaw',
|
|
17
|
+
dir: path.join(home, '.openclaw', 'skills', SKILL_NAME),
|
|
18
|
+
file: 'SKILL.md',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'Windsurf',
|
|
22
|
+
dir: path.join(home, '.codeium', 'windsurf', 'skills', SKILL_NAME),
|
|
23
|
+
file: 'SKILL.md',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'Codex',
|
|
27
|
+
dir: path.join(home, '.codex', 'skills', SKILL_NAME),
|
|
28
|
+
file: 'SKILL.md',
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
function detectInstalled() {
|
|
33
|
+
const markers = {
|
|
34
|
+
'Claude Code': path.join(os.homedir(), '.claude'),
|
|
35
|
+
'OpenClaw': path.join(os.homedir(), '.openclaw'),
|
|
36
|
+
'Windsurf': path.join(os.homedir(), '.codeium', 'windsurf'),
|
|
37
|
+
'Codex': path.join(os.homedir(), '.codex'),
|
|
38
|
+
};
|
|
39
|
+
return allAgents().filter(a => fs.existsSync(markers[a.name]));
|
|
40
|
+
}
|
|
41
|
+
const AGENT_ALIASES = {
|
|
42
|
+
'claude-code': 'Claude Code',
|
|
43
|
+
'claude': 'Claude Code',
|
|
44
|
+
'openclaw': 'OpenClaw',
|
|
45
|
+
'windsurf': 'Windsurf',
|
|
46
|
+
'codex': 'Codex',
|
|
47
|
+
};
|
|
48
|
+
function resolveAgentByName(name) {
|
|
49
|
+
const normalized = AGENT_ALIASES[name.toLowerCase()];
|
|
50
|
+
if (!normalized)
|
|
51
|
+
return undefined;
|
|
52
|
+
return allAgents().find(a => a.name === normalized);
|
|
53
|
+
}
|
|
54
|
+
export async function installSkill(options) {
|
|
55
|
+
const skillUrl = `${options.serverUrl}/api/tools/skill`;
|
|
56
|
+
if (options.outputPath) {
|
|
57
|
+
const resolved = path.join(resolvePath(options.outputPath), SKILL_NAME, 'SKILL.md');
|
|
58
|
+
fs.mkdirSync(path.dirname(resolved), { recursive: true });
|
|
59
|
+
await downloadTo(skillUrl, resolved);
|
|
60
|
+
console.log(`Skill installed to ${resolved}`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (options.agent) {
|
|
64
|
+
const target = resolveAgentByName(options.agent);
|
|
65
|
+
if (!target) {
|
|
66
|
+
const valid = Object.keys(AGENT_ALIASES).join(', ');
|
|
67
|
+
console.error(`Unknown agent: ${options.agent}. Valid options: ${valid}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
fs.mkdirSync(target.dir, { recursive: true });
|
|
71
|
+
const dest = path.join(target.dir, target.file);
|
|
72
|
+
await downloadTo(skillUrl, dest);
|
|
73
|
+
console.log(`Skill installed for ${target.name}: ${dest}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const installed = detectInstalled();
|
|
77
|
+
const agents = installed.length > 0 ? installed : allAgents();
|
|
78
|
+
const choices = [
|
|
79
|
+
...agents.map(a => ({
|
|
80
|
+
name: `${a.name} → ${shortenHome(path.join(a.dir, a.file))}`,
|
|
81
|
+
value: a.name,
|
|
82
|
+
})),
|
|
83
|
+
{ name: 'Custom path', value: CUSTOM_CHOICE },
|
|
84
|
+
];
|
|
85
|
+
const chosen = await select({
|
|
86
|
+
message: 'Install skill for:',
|
|
87
|
+
choices,
|
|
88
|
+
});
|
|
89
|
+
if (chosen === CUSTOM_CHOICE) {
|
|
90
|
+
const raw = await input({
|
|
91
|
+
message: 'Enter skills directory:',
|
|
92
|
+
default: './',
|
|
93
|
+
});
|
|
94
|
+
const resolved = path.join(resolvePath(raw), SKILL_NAME, 'SKILL.md');
|
|
95
|
+
fs.mkdirSync(path.dirname(resolved), { recursive: true });
|
|
96
|
+
await downloadTo(skillUrl, resolved);
|
|
97
|
+
console.log(`Skill installed to ${resolved}`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const target = agents.find(a => a.name === chosen);
|
|
101
|
+
fs.mkdirSync(target.dir, { recursive: true });
|
|
102
|
+
const dest = path.join(target.dir, target.file);
|
|
103
|
+
await downloadTo(skillUrl, dest);
|
|
104
|
+
console.log(`Skill installed for ${target.name}: ${dest}`);
|
|
105
|
+
}
|
|
106
|
+
function resolvePath(p) {
|
|
107
|
+
if (p.startsWith('~')) {
|
|
108
|
+
return path.join(os.homedir(), p.slice(1));
|
|
109
|
+
}
|
|
110
|
+
return path.resolve(p);
|
|
111
|
+
}
|
|
112
|
+
function shortenHome(p) {
|
|
113
|
+
const home = os.homedir();
|
|
114
|
+
return p.startsWith(home) ? '~' + p.slice(home.length) : p;
|
|
115
|
+
}
|
|
116
|
+
async function downloadTo(url, dest) {
|
|
117
|
+
const res = await fetch(url);
|
|
118
|
+
if (!res.ok) {
|
|
119
|
+
throw new Error(`Failed to download skill: ${res.status} ${res.statusText}`);
|
|
120
|
+
}
|
|
121
|
+
const text = await res.text();
|
|
122
|
+
if (!text.startsWith('---')) {
|
|
123
|
+
throw new Error('Downloaded content is not a valid skill file');
|
|
124
|
+
}
|
|
125
|
+
fs.writeFileSync(dest, text);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=install-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/install-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-client.js","sourceRoot":"","sources":["../../src/local-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAGvC,MAAM,OAAO,WAAW;IACd,KAAK,CAAO;IAEpB,YAAY,UAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"local-client.js","sourceRoot":"","sources":["../../src/local-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAGvC,MAAM,OAAO,WAAW;IACd,KAAK,CAAO;IAEpB,YAAY,UAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAMd;QACC,IAAI,UAAkB,CAAA;QACtB,IAAI,IAA6B,CAAA;QAEjC,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,uBAAuB,EAAE;gBACzE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC5B,UAAU,EAAE,IAAI,CAAC,KAAK;aACvB,CAAC,CAAA;YACF,UAAU,GAAG,EAAE,CAAA;YACf,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAA6B,CAAA;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAA;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,mBAAmB,UAAU,EAAE,CAAA;YACvE,IAAI,UAAU,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1D,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAA;gBACzE,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;gBACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACpB,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QAED,OAAO;YACL,KAAK,EAAG,IAAI,CAAC,KAAgB,IAAI,EAAE;YACnC,IAAI,EAAG,IAAI,CAAC,IAAe,IAAI,EAAE;YACjC,GAAG,EAAG,IAAI,CAAC,GAAc,IAAI,MAAM,CAAC,GAAG;YACvC,SAAS,EAAE,IAAI,CAAC,SAA+B;YAC/C,WAAW,EAAE,IAAI,CAAC,WAAkC;SACrD,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,gCAAgC,EAAE;YAC3E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;YACnC,UAAU,EAAE,IAAI,CAAC,KAAK;SACvB,CAAC,CAAA;QACF,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAA4B,CAAA;YACxD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,yBAAyB,UAAU,GAAG,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,yBAAyB,EAAE;gBAC9D,UAAU,EAAE,IAAI,CAAC,KAAK;aACvB,CAAC,CAAA;YACF,OAAO,UAAU,KAAK,GAAG,CAAA;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,28 +1,8 @@
|
|
|
1
|
-
interface McpTool {
|
|
2
|
-
name: string;
|
|
3
|
-
description?: string;
|
|
4
|
-
inputSchema?: Record<string, unknown>;
|
|
5
|
-
}
|
|
6
|
-
interface RegisterResponse {
|
|
7
|
-
deviceId: string;
|
|
8
|
-
name: string;
|
|
9
|
-
type: string;
|
|
10
|
-
}
|
|
11
1
|
export declare class ServerClient {
|
|
12
2
|
private serverUrl;
|
|
13
3
|
private apiKey;
|
|
14
4
|
constructor(serverUrl: string, apiKey: string);
|
|
15
5
|
private request;
|
|
16
|
-
connect(params: {
|
|
17
|
-
name?: string;
|
|
18
|
-
type: 'chrome';
|
|
19
|
-
deviceId?: string;
|
|
20
|
-
tools?: McpTool[];
|
|
21
|
-
}): Promise<RegisterResponse>;
|
|
22
|
-
disconnect(deviceId: string): Promise<void>;
|
|
23
|
-
heartbeat(deviceId: string): Promise<void>;
|
|
24
|
-
pollCommand(deviceId: string, signal?: AbortSignal): Promise<Record<string, unknown> | null>;
|
|
25
|
-
sendResult(requestId: string, result: Record<string, unknown>): Promise<void>;
|
|
26
6
|
readPage(params: {
|
|
27
7
|
url: string;
|
|
28
8
|
screens?: number;
|
|
@@ -33,6 +13,21 @@ export declare class ServerClient {
|
|
|
33
13
|
sessionId?: string;
|
|
34
14
|
}): Promise<ReadPageResult>;
|
|
35
15
|
closeSession(sessionId: string): Promise<void>;
|
|
16
|
+
readPageRaw(params: {
|
|
17
|
+
url: string;
|
|
18
|
+
screens?: number;
|
|
19
|
+
timeout?: number;
|
|
20
|
+
reuseTab?: boolean;
|
|
21
|
+
deviceId?: string;
|
|
22
|
+
format?: string;
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
}): Promise<Record<string, unknown>>;
|
|
25
|
+
getEncryptionConfig(): Promise<{
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
salt?: string;
|
|
28
|
+
keyCheck?: string;
|
|
29
|
+
kid?: number;
|
|
30
|
+
}>;
|
|
36
31
|
search(params: {
|
|
37
32
|
query: string;
|
|
38
33
|
num?: number;
|
|
@@ -53,4 +48,3 @@ export interface SearchResult {
|
|
|
53
48
|
position: number;
|
|
54
49
|
}>;
|
|
55
50
|
}
|
|
56
|
-
export {};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { logger } from './logger.js';
|
|
2
1
|
export class ServerClient {
|
|
3
2
|
serverUrl;
|
|
4
3
|
apiKey;
|
|
@@ -30,69 +29,6 @@ export class ServerClient {
|
|
|
30
29
|
clearTimeout(timer);
|
|
31
30
|
}
|
|
32
31
|
}
|
|
33
|
-
async connect(params) {
|
|
34
|
-
const res = await this.request('/api/dokos/connect', {
|
|
35
|
-
method: 'POST',
|
|
36
|
-
body: JSON.stringify(params),
|
|
37
|
-
});
|
|
38
|
-
if (!res.ok) {
|
|
39
|
-
const body = await res.json().catch(() => ({}));
|
|
40
|
-
throw new Error(`Registration failed (${res.status}): ${body.error || res.statusText}`);
|
|
41
|
-
}
|
|
42
|
-
return res.json();
|
|
43
|
-
}
|
|
44
|
-
async disconnect(deviceId) {
|
|
45
|
-
try {
|
|
46
|
-
await this.request('/api/dokos/disconnect', {
|
|
47
|
-
method: 'POST',
|
|
48
|
-
body: JSON.stringify({ deviceId }),
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
catch { /* best effort */ }
|
|
52
|
-
}
|
|
53
|
-
async heartbeat(deviceId) {
|
|
54
|
-
const res = await this.request('/api/devices/heartbeat', {
|
|
55
|
-
method: 'POST',
|
|
56
|
-
body: JSON.stringify({ deviceId }),
|
|
57
|
-
});
|
|
58
|
-
if (!res.ok) {
|
|
59
|
-
logger.warn(`Heartbeat failed: ${res.status}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async pollCommand(deviceId, signal) {
|
|
63
|
-
const res = await this.request(`/api/commands/poll?deviceId=${encodeURIComponent(deviceId)}`, {
|
|
64
|
-
method: 'GET',
|
|
65
|
-
signal,
|
|
66
|
-
timeoutMs: 90_000,
|
|
67
|
-
});
|
|
68
|
-
if (res.status === 204)
|
|
69
|
-
return null;
|
|
70
|
-
if (!res.ok) {
|
|
71
|
-
throw new Error(`Poll failed: ${res.status}`);
|
|
72
|
-
}
|
|
73
|
-
return res.json();
|
|
74
|
-
}
|
|
75
|
-
async sendResult(requestId, result) {
|
|
76
|
-
const maxRetries = 3;
|
|
77
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
78
|
-
try {
|
|
79
|
-
const res = await this.request(`/api/commands/${requestId}/result`, {
|
|
80
|
-
method: 'POST',
|
|
81
|
-
body: JSON.stringify(result),
|
|
82
|
-
});
|
|
83
|
-
if (res.ok)
|
|
84
|
-
return;
|
|
85
|
-
logger.warn(`sendResult HTTP error: ${res.status}, attempt ${attempt + 1}`);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
logger.error(`sendResult failed, attempt ${attempt + 1}`, error);
|
|
89
|
-
}
|
|
90
|
-
if (attempt < maxRetries - 1) {
|
|
91
|
-
await new Promise(r => setTimeout(r, 300 * (attempt + 1)));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
logger.error(`sendResult failed after all retries for ${requestId}`);
|
|
95
|
-
}
|
|
96
32
|
async readPage(params) {
|
|
97
33
|
const res = await this.request('/api/tools/read', {
|
|
98
34
|
method: 'POST',
|
|
@@ -123,6 +59,29 @@ export class ServerClient {
|
|
|
123
59
|
throw new Error(`Close session failed (${res.status}): ${body.error || res.statusText}`);
|
|
124
60
|
}
|
|
125
61
|
}
|
|
62
|
+
async readPageRaw(params) {
|
|
63
|
+
const res = await this.request('/api/tools/read', {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
body: JSON.stringify(params),
|
|
66
|
+
timeoutMs: ((params.timeout ?? 60) + 30) * 1000,
|
|
67
|
+
});
|
|
68
|
+
if (!res.ok) {
|
|
69
|
+
const body = await res.json().catch(() => ({}));
|
|
70
|
+
throw new Error(`Read failed (${res.status}): ${body.error || res.statusText}`);
|
|
71
|
+
}
|
|
72
|
+
return res.json();
|
|
73
|
+
}
|
|
74
|
+
async getEncryptionConfig() {
|
|
75
|
+
try {
|
|
76
|
+
const res = await this.request('/api/encryption', { method: 'GET' });
|
|
77
|
+
if (!res.ok)
|
|
78
|
+
return { enabled: false };
|
|
79
|
+
return res.json();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { enabled: false };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
126
85
|
async search(params) {
|
|
127
86
|
const res = await this.request('/api/tools/search', {
|
|
128
87
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-client.js","sourceRoot":"","sources":["../../src/server-client.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"server-client.js","sourceRoot":"","sources":["../../src/server-client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.js
CHANGED
|
@@ -7,9 +7,20 @@ export function getCurrentVersion() {
|
|
|
7
7
|
return cachedVersion;
|
|
8
8
|
try {
|
|
9
9
|
const thisDir = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
// Walk up to find cli's package.json (works for both src/ and dist/src/)
|
|
11
|
+
let dir = thisDir;
|
|
12
|
+
while (dir !== path.dirname(dir)) {
|
|
13
|
+
const candidate = path.join(dir, 'package.json');
|
|
14
|
+
if (fs.existsSync(candidate)) {
|
|
15
|
+
const pkg = JSON.parse(fs.readFileSync(candidate, 'utf-8'));
|
|
16
|
+
if (pkg.name === '@dokobot/cli') {
|
|
17
|
+
cachedVersion = pkg.version;
|
|
18
|
+
return cachedVersion;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
dir = path.dirname(dir);
|
|
22
|
+
}
|
|
23
|
+
cachedVersion = '0.0.0';
|
|
13
24
|
}
|
|
14
25
|
catch {
|
|
15
26
|
cachedVersion = '0.0.0';
|
package/dist/src/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,IAAI,aAAiC,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,IAAI,aAAiC,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,yEAAyE;QACzE,IAAI,GAAG,GAAG,OAAO,CAAC;QAClB,OAAO,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC5D,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAChC,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC;oBAC5B,OAAO,aAAc,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,aAAa,GAAG,OAAO,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,OAAO,CAAC;IAC1B,CAAC;IACD,OAAO,aAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dokobot/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Dokobot CLI - Connect your Chrome browser to AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
32
32
|
"commander": "^12.0.0",
|
|
33
33
|
"inquirer": "^12.0.0",
|
|
34
|
+
"jose": "^6.2.2",
|
|
35
|
+
"scrypt-js": "^3.0.1",
|
|
34
36
|
"undici": "^7"
|
|
35
37
|
},
|
|
36
38
|
"devDependencies": {
|