@1claw/cli 0.34.1 → 0.34.2

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 CHANGED
@@ -1,4 +1,4 @@
1
- # @1claw/cli (v0.34.1)
1
+ # @1claw/cli (v0.34.2)
2
2
 
3
3
  Command-line interface for [1Claw](https://1claw.xyz) — HSM-backed secret management for AI agents and humans.
4
4
 
@@ -506,6 +506,68 @@ Manage registered mobile companion app devices.
506
506
  1claw config set output-format json # Set default output
507
507
  ```
508
508
 
509
+ ## Local Vault (Offline, Encrypted)
510
+
511
+ Store secrets locally in an encrypted vault — no cloud required. Secrets are encrypted at rest with AES-256-GCM using a passphrase-derived key (PBKDF2, 100k iterations).
512
+
513
+ ```bash
514
+ 1claw local init # Create local vault with passphrase
515
+ 1claw local add STRIPE_KEY # Add secret (prompted, masked)
516
+ 1claw local list # List secret names (never values)
517
+ 1claw local get STRIPE_KEY # Retrieve a value
518
+ 1claw local rm STRIPE_KEY # Remove a secret
519
+ 1claw local import .env # Import .env file into local vault
520
+ 1claw local export -o .env # Export as .env format
521
+ 1claw local sync -v <vault-id> # Push local secrets to cloud vault
522
+ 1claw local sync --pull -v <id> # Pull cloud secrets into local vault
523
+ 1claw local status # Show vault info (count, sync status)
524
+ 1claw local destroy # Permanently delete local vault
525
+ ```
526
+
527
+ Vault file: `~/.config/1claw/local-vault.enc` (0600 permissions, safe to back up).
528
+
529
+ ## Local Daemon (Secret Proxy)
530
+
531
+ The daemon serves secrets over a Unix socket and injects them into HTTP requests without exposing values to the AI model. This provides a trust boundary: the model knows *which* secret to use and *where* to send it, but never sees the raw value.
532
+
533
+ ```bash
534
+ # Start the daemon (unlocks vault, listens on socket)
535
+ 1claw daemon start
536
+
537
+ # Manage per-secret policies (which hosts can receive each secret)
538
+ 1claw daemon policy add STRIPE_KEY --hosts api.stripe.com
539
+ 1claw daemon policy add OPENAI_KEY --hosts api.openai.com,*.openai.com
540
+ 1claw daemon policy list
541
+ 1claw daemon policy remove STRIPE_KEY
542
+
543
+ # Check daemon status
544
+ 1claw daemon status
545
+
546
+ # Stop the daemon
547
+ 1claw daemon stop
548
+ ```
549
+
550
+ ### Setup for Local Mode
551
+
552
+ Configure AI clients to use the daemon instead of the cloud API:
553
+
554
+ ```bash
555
+ 1claw setup --local
556
+ ```
557
+
558
+ This sets `ONECLAW_LOCAL_VAULT=true` and `ONECLAW_DAEMON_SOCKET` in the MCP config, so the MCP server connects to the local daemon instead of `api.1claw.xyz`. The model uses `proxy_request` to make API calls with secrets injected — the secret value never enters the model's context.
559
+
560
+ ### Architecture
561
+
562
+ ```
563
+ AI Client (Claude, Cursor, etc.)
564
+ └─ MCP Server (@1claw/mcp, local mode)
565
+ └─ Unix Socket (/~/.config/1claw/daemon.sock)
566
+ └─ 1claw Daemon (holds decrypted vault in memory)
567
+ ├─ Policy Engine (per-secret host allowlist)
568
+ └─ Secret Proxy (injects credentials into HTTP requests)
569
+ ```
570
+
509
571
  ## Global options
510
572
 
511
573
  ```bash
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const daemonCommand: Command;
3
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkEpC,eAAO,MAAM,aAAa,SAEzB,CAAC"}
@@ -0,0 +1,347 @@
1
+ import { Command } from "commander";
2
+ import { createServer, } from "node:http";
3
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+ import chalk from "chalk";
7
+ import inquirer from "inquirer";
8
+ import { printSuccess, printError, printWarning, printInfo, printKeyValue, printTable, } from "../output.js";
9
+ import { vaultExists, loadVault, getSecret, listSecrets, } from "../local-vault.js";
10
+ import { loadPolicy, savePolicy, isHostAllowed, setSecretPolicy, removeSecretPolicy, getPolicyPath, policyExists, } from "../local-policy.js";
11
+ import { proxyRequest } from "../secret-proxy.js";
12
+ const CONFIG_DIR = process.env.ONECLAW_CONFIG_DIR || join(homedir(), ".config", "1claw");
13
+ const SOCKET_PATH = process.env.ONECLAW_DAEMON_SOCKET || join(CONFIG_DIR, "daemon.sock");
14
+ const PID_FILE = join(CONFIG_DIR, "daemon.pid");
15
+ function readBody(req) {
16
+ return new Promise((resolve, reject) => {
17
+ const chunks = [];
18
+ req.on("data", (c) => chunks.push(c));
19
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
20
+ req.on("error", reject);
21
+ });
22
+ }
23
+ function jsonResponse(res, status, body) {
24
+ res.writeHead(status, { "Content-Type": "application/json" });
25
+ res.end(JSON.stringify(body));
26
+ }
27
+ export const daemonCommand = new Command("daemon").description("Local daemon — serves secrets over a Unix socket without exposing values");
28
+ // ── daemon start ─────────────────────────────────────────
29
+ daemonCommand
30
+ .command("start")
31
+ .description("Start the local secret daemon on a Unix socket")
32
+ .option("--foreground", "Run in the foreground (don't daemonize)")
33
+ .option("--socket <path>", "Custom socket path")
34
+ .action(async (opts) => {
35
+ try {
36
+ if (!vaultExists()) {
37
+ printError("No local vault. Run `1claw local init` first.");
38
+ process.exit(1);
39
+ }
40
+ const socketPath = opts.socket ?? SOCKET_PATH;
41
+ if (existsSync(socketPath)) {
42
+ try {
43
+ unlinkSync(socketPath);
44
+ }
45
+ catch {
46
+ printError(`Socket ${socketPath} exists and cannot be removed. Is another daemon running?`);
47
+ process.exit(1);
48
+ }
49
+ }
50
+ console.log();
51
+ printInfo("Unlocking local vault to start daemon...");
52
+ const { passphrase } = await inquirer.prompt([
53
+ {
54
+ type: "password",
55
+ name: "passphrase",
56
+ message: "Vault passphrase:",
57
+ mask: "*",
58
+ },
59
+ ]);
60
+ let vault;
61
+ try {
62
+ vault = loadVault(passphrase);
63
+ }
64
+ catch {
65
+ printError("Wrong passphrase or corrupted vault file.");
66
+ process.exit(1);
67
+ }
68
+ const policy = loadPolicy();
69
+ const secretCount = Object.keys(vault.secrets).length;
70
+ const policyCount = Object.keys(policy.secrets).length;
71
+ const server = createDaemonServer(vault, policy);
72
+ server.listen(socketPath, () => {
73
+ try {
74
+ const { chmodSync } = require("node:fs");
75
+ chmodSync(socketPath, 0o600);
76
+ }
77
+ catch {
78
+ // best-effort
79
+ }
80
+ writeFileSync(PID_FILE, String(process.pid));
81
+ console.log();
82
+ printSuccess(`1Claw daemon running on ${chalk.bold(socketPath)}`);
83
+ printInfo(`Serving ${secretCount} secret(s), ${policyCount} policy rule(s).`);
84
+ printInfo("Press Ctrl+C to stop.");
85
+ console.log();
86
+ printInfo("Configure MCP for local mode:");
87
+ console.log(chalk.dim(` 1claw setup --local\n` +
88
+ ` # or set ONECLAW_DAEMON_SOCKET=${socketPath}`));
89
+ console.log();
90
+ });
91
+ const shutdown = () => {
92
+ console.log();
93
+ printInfo("Shutting down daemon...");
94
+ server.close(() => {
95
+ try {
96
+ unlinkSync(socketPath);
97
+ }
98
+ catch { /* ok */ }
99
+ try {
100
+ unlinkSync(PID_FILE);
101
+ }
102
+ catch { /* ok */ }
103
+ process.exit(0);
104
+ });
105
+ setTimeout(() => process.exit(0), 3000);
106
+ };
107
+ process.on("SIGINT", shutdown);
108
+ process.on("SIGTERM", shutdown);
109
+ }
110
+ catch (err) {
111
+ if (err instanceof Error)
112
+ printError(err.message);
113
+ else
114
+ printError(String(err));
115
+ process.exit(1);
116
+ }
117
+ });
118
+ // ── daemon stop ──────────────────────────────────────────
119
+ daemonCommand
120
+ .command("stop")
121
+ .description("Stop the running daemon")
122
+ .action(() => {
123
+ if (!existsSync(PID_FILE)) {
124
+ printInfo("No daemon PID file found. The daemon may not be running.");
125
+ return;
126
+ }
127
+ try {
128
+ const pid = parseInt(readFileSync(PID_FILE, "utf-8").trim(), 10);
129
+ process.kill(pid, "SIGTERM");
130
+ printSuccess(`Sent SIGTERM to daemon (PID ${pid}).`);
131
+ }
132
+ catch (err) {
133
+ if (err.code === "ESRCH") {
134
+ printWarning("Daemon process not found. Cleaning up PID file.");
135
+ }
136
+ else {
137
+ printError(`Failed to stop daemon: ${err.message}`);
138
+ }
139
+ }
140
+ try {
141
+ unlinkSync(PID_FILE);
142
+ }
143
+ catch { /* ok */ }
144
+ });
145
+ // ── daemon status ────────────────────────────────────────
146
+ daemonCommand
147
+ .command("status")
148
+ .description("Show daemon status")
149
+ .action(() => {
150
+ const socketExists = existsSync(process.env.ONECLAW_DAEMON_SOCKET || SOCKET_PATH);
151
+ let pidRunning = false;
152
+ let pid = "";
153
+ if (existsSync(PID_FILE)) {
154
+ pid = readFileSync(PID_FILE, "utf-8").trim();
155
+ try {
156
+ process.kill(parseInt(pid, 10), 0);
157
+ pidRunning = true;
158
+ }
159
+ catch {
160
+ pidRunning = false;
161
+ }
162
+ }
163
+ printKeyValue([
164
+ [
165
+ "Daemon",
166
+ pidRunning
167
+ ? chalk.green("running") + ` (PID ${pid})`
168
+ : chalk.dim("stopped"),
169
+ ],
170
+ [
171
+ "Socket",
172
+ socketExists
173
+ ? chalk.green(SOCKET_PATH)
174
+ : chalk.dim("not found"),
175
+ ],
176
+ [
177
+ "Policy",
178
+ policyExists()
179
+ ? chalk.green(getPolicyPath())
180
+ : chalk.dim("none (using defaults)"),
181
+ ],
182
+ ]);
183
+ });
184
+ // ── daemon policy ────────────────────────────────────────
185
+ const policyCmd = daemonCommand
186
+ .command("policy")
187
+ .description("Manage per-secret host allowlist policies");
188
+ policyCmd
189
+ .command("add <secret>")
190
+ .description("Add or update a policy for a secret")
191
+ .requiredOption("--hosts <hosts>", "Comma-separated allowed hosts (e.g. api.stripe.com,*.openai.com)")
192
+ .option("--inject-as <method>", "Injection method: bearer, header, basic, query", "bearer")
193
+ .option("--header-name <name>", "Header name (for inject-as=header)")
194
+ .option("--query-param <param>", "Query parameter name (for inject-as=query)")
195
+ .action((secret, opts) => {
196
+ const policy = loadPolicy();
197
+ const sp = {
198
+ allowed_hosts: opts.hosts.split(",").map((h) => h.trim()),
199
+ inject_as: opts.injectAs,
200
+ };
201
+ if (opts.headerName)
202
+ sp.header_name = opts.headerName;
203
+ if (opts.queryParam)
204
+ sp.query_param = opts.queryParam;
205
+ setSecretPolicy(policy, secret, sp);
206
+ savePolicy(policy);
207
+ printSuccess(`Policy set for ${chalk.bold(secret)}: allowed hosts = [${sp.allowed_hosts.join(", ")}]`);
208
+ });
209
+ policyCmd
210
+ .command("remove <secret>")
211
+ .description("Remove a policy for a secret")
212
+ .action((secret) => {
213
+ const policy = loadPolicy();
214
+ if (removeSecretPolicy(policy, secret)) {
215
+ savePolicy(policy);
216
+ printSuccess(`Policy removed for ${chalk.bold(secret)}.`);
217
+ }
218
+ else {
219
+ printWarning(`No policy found for "${secret}".`);
220
+ }
221
+ });
222
+ policyCmd
223
+ .command("list")
224
+ .alias("ls")
225
+ .description("List all secret policies")
226
+ .action(() => {
227
+ const policy = loadPolicy();
228
+ const entries = Object.entries(policy.secrets);
229
+ if (entries.length === 0) {
230
+ printInfo("No policies configured. Add one with: 1claw daemon policy add <secret> --hosts <hosts>");
231
+ return;
232
+ }
233
+ printTable(entries.map(([name, sp]) => ({
234
+ secret: name,
235
+ hosts: sp.allowed_hosts.join(", "),
236
+ inject: sp.inject_as,
237
+ })), [
238
+ { key: "secret", header: "Secret" },
239
+ { key: "hosts", header: "Allowed Hosts" },
240
+ { key: "inject", header: "Inject As" },
241
+ ]);
242
+ });
243
+ // ── Daemon HTTP server on Unix socket ────────────────────
244
+ function createDaemonServer(vault, policy) {
245
+ return createServer(async (req, res) => {
246
+ const path = req.url ?? "/";
247
+ const method = req.method ?? "GET";
248
+ // Health check
249
+ if (path === "/health") {
250
+ jsonResponse(res, 200, {
251
+ status: "ok",
252
+ daemon: "1claw",
253
+ secrets: Object.keys(vault.secrets).length,
254
+ policies: Object.keys(policy.secrets).length,
255
+ });
256
+ return;
257
+ }
258
+ // List secret names (never values)
259
+ if (path === "/secrets" && method === "GET") {
260
+ const secrets = listSecrets(vault).map((s) => ({
261
+ name: s.name,
262
+ type: s.type,
263
+ synced: s.synced,
264
+ }));
265
+ jsonResponse(res, 200, { secrets });
266
+ return;
267
+ }
268
+ // Check if a secret exists + get metadata
269
+ if (path.startsWith("/secrets/") && method === "GET") {
270
+ const name = decodeURIComponent(path.slice("/secrets/".length));
271
+ const secret = getSecret(vault, name);
272
+ if (!secret) {
273
+ jsonResponse(res, 404, { error: `Secret "${name}" not found` });
274
+ return;
275
+ }
276
+ jsonResponse(res, 200, {
277
+ name,
278
+ type: secret.type,
279
+ synced: secret.synced_to_cloud,
280
+ created_at: secret.created_at,
281
+ updated_at: secret.updated_at,
282
+ has_policy: !!policy.secrets[name],
283
+ });
284
+ return;
285
+ }
286
+ // Proxy request — inject secret without exposing value
287
+ if (path === "/proxy" && method === "POST") {
288
+ let body;
289
+ try {
290
+ body = await readBody(req);
291
+ }
292
+ catch {
293
+ jsonResponse(res, 400, { error: "Failed to read request body" });
294
+ return;
295
+ }
296
+ let proxyReq;
297
+ try {
298
+ proxyReq = JSON.parse(body);
299
+ }
300
+ catch {
301
+ jsonResponse(res, 400, { error: "Invalid JSON body" });
302
+ return;
303
+ }
304
+ if (!proxyReq.secretName || !proxyReq.url) {
305
+ jsonResponse(res, 400, {
306
+ error: "Missing required fields: secretName, url",
307
+ });
308
+ return;
309
+ }
310
+ const result = await proxyRequest(proxyReq, vault, policy);
311
+ if (!result.success) {
312
+ jsonResponse(res, 403, { error: result.error });
313
+ return;
314
+ }
315
+ jsonResponse(res, 200, {
316
+ status: result.response.status,
317
+ headers: result.response.headers,
318
+ body: result.response.body,
319
+ });
320
+ return;
321
+ }
322
+ // Check policy for a secret + host
323
+ if (path === "/check-policy" && method === "POST") {
324
+ let body;
325
+ try {
326
+ body = await readBody(req);
327
+ }
328
+ catch {
329
+ jsonResponse(res, 400, { error: "Failed to read request body" });
330
+ return;
331
+ }
332
+ let parsed;
333
+ try {
334
+ parsed = JSON.parse(body);
335
+ }
336
+ catch {
337
+ jsonResponse(res, 400, { error: "Invalid JSON body" });
338
+ return;
339
+ }
340
+ const check = isHostAllowed(policy, parsed.secretName, parsed.url);
341
+ jsonResponse(res, check.allowed ? 200 : 403, check);
342
+ return;
343
+ }
344
+ jsonResponse(res, 404, { error: "Not found" });
345
+ });
346
+ }
347
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/commands/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const localCommand: Command;
3
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/commands/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4FpC,eAAO,MAAM,YAAY,SAExB,CAAC"}