@nordsym/apiclaw 2.7.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/dist/auth-config.d.ts +41 -0
- package/dist/auth-config.d.ts.map +1 -0
- package/dist/auth-config.js +162 -0
- package/dist/auth-config.js.map +1 -0
- package/dist/auth-config.test.d.ts +2 -0
- package/dist/auth-config.test.d.ts.map +1 -0
- package/dist/auth-config.test.js +153 -0
- package/dist/auth-config.test.js.map +1 -0
- package/dist/bin.js +9 -5
- package/dist/bin.js.map +1 -1
- package/dist/capability-router.js +1 -1
- package/dist/capability-router.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +27 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +340 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/doctor.js +1 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/index.js +48 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/execute-dynamic.js +1 -1
- package/dist/execute-dynamic.js.map +1 -1
- package/dist/gateway-client.d.ts +2 -0
- package/dist/gateway-client.d.ts.map +1 -1
- package/dist/gateway-client.js.map +1 -1
- package/dist/hivr-whitelist.js +1 -1
- package/dist/hivr-whitelist.js.map +1 -1
- package/dist/index.js +23 -16
- package/dist/index.js.map +1 -1
- package/dist/product-whitelist.js +1 -1
- package/dist/product-whitelist.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +18 -0
- package/dist/session.js.map +1 -1
- package/dist/telemetry.js +1 -1
- package/dist/telemetry.js.map +1 -1
- package/package.json +2 -2
- package/dist/bin.bundled.js +0 -79288
- package/dist/index.bundled.js +0 -61263
package/README.md
CHANGED
|
@@ -13,10 +13,16 @@ The API layer for AI agents.
|
|
|
13
13
|
## Install
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
+
# 1. Install the MCP server
|
|
16
17
|
curl -fsSL https://apiclaw.cloud/install.sh | bash
|
|
18
|
+
|
|
19
|
+
# 2. Authenticate (browser opens, one tap, ~10 seconds)
|
|
20
|
+
npx @nordsym/apiclaw auth login
|
|
17
21
|
```
|
|
18
22
|
|
|
19
|
-
Adds APIClaw as an MCP server in your Claude, Cursor, or any MCP-compatible agent.
|
|
23
|
+
Adds APIClaw as an MCP server in your Claude, Cursor, Windsurf, or any MCP-compatible agent. The auth flow opens your browser, signs you in via Clerk (Google one-tap or passwordless email), and writes `~/.apiclaw.toml`. The same workspace then works across MCP, CLI, HTTP gateway, and Remote MCP. Free tier: 25 calls/month.
|
|
24
|
+
|
|
25
|
+
> **Headless server or SSH?** `npx @nordsym/apiclaw auth login --email-fallback` runs the legacy magic-link flow.
|
|
20
26
|
|
|
21
27
|
---
|
|
22
28
|
|
|
@@ -174,7 +180,7 @@ The remaining ~6,500 OpenAPI-spec'd providers in the registry have valid integra
|
|
|
174
180
|
| `call_api` | Execute through APIClaw proxy |
|
|
175
181
|
| `list_connected` | See available managed providers |
|
|
176
182
|
| `check_balance` | Usage and remaining calls |
|
|
177
|
-
| `register_owner` |
|
|
183
|
+
| `register_owner` | Legacy auth (email magic-link). Canonical flow: run `npx @nordsym/apiclaw auth login` in the terminal — the MCP server reads `~/.apiclaw.toml` and unlocks 25 calls/month |
|
|
178
184
|
|
|
179
185
|
## Pricing
|
|
180
186
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw auth-config — Modal-style TOML config at ~/.apiclaw.toml
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for CLI, MCP server, and HTTP runtimes that
|
|
5
|
+
* import @nordsym/apiclaw/auth. Replaces the JSON files in ~/.apiclaw/
|
|
6
|
+
* but reads them as a fallback for back-compat.
|
|
7
|
+
*
|
|
8
|
+
* File permissions: 0o600.
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthConfig {
|
|
11
|
+
workspaceId: string;
|
|
12
|
+
email: string;
|
|
13
|
+
sessionToken: string;
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
mcpToken?: string;
|
|
16
|
+
createdAt: number;
|
|
17
|
+
lastUsedAt?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Read auth config. Tries ~/.apiclaw.toml first, then falls back to the
|
|
21
|
+
* legacy JSON files written by older session.ts versions.
|
|
22
|
+
*/
|
|
23
|
+
export declare function readAuthConfig(): AuthConfig | null;
|
|
24
|
+
/**
|
|
25
|
+
* Write auth config to ~/.apiclaw.toml with mode 0o600.
|
|
26
|
+
* Best-effort migration: if legacy ~/.apiclaw/session exists, leave it
|
|
27
|
+
* (session.ts continues to read it) so older binaries on the same machine
|
|
28
|
+
* keep working until the next install bump.
|
|
29
|
+
*/
|
|
30
|
+
export declare function writeAuthConfig(cfg: AuthConfig): void;
|
|
31
|
+
/**
|
|
32
|
+
* Update only lastUsedAt without rewriting the rest. Useful for the MCP
|
|
33
|
+
* server's session-touch on each call.
|
|
34
|
+
*/
|
|
35
|
+
export declare function touchAuthConfig(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Clear ~/.apiclaw.toml (and the legacy files). Used by `apiclaw auth logout`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function clearAuthConfig(): void;
|
|
40
|
+
export declare const AUTH_CONFIG_PATH: string;
|
|
41
|
+
//# sourceMappingURL=auth-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-config.d.ts","sourceRoot":"","sources":["../src/auth-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CAiClD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAWrD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAQtC;AAED,eAAO,MAAM,gBAAgB,QAAY,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw auth-config — Modal-style TOML config at ~/.apiclaw.toml
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for CLI, MCP server, and HTTP runtimes that
|
|
5
|
+
* import @nordsym/apiclaw/auth. Replaces the JSON files in ~/.apiclaw/
|
|
6
|
+
* but reads them as a fallback for back-compat.
|
|
7
|
+
*
|
|
8
|
+
* File permissions: 0o600.
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import * as os from 'os';
|
|
13
|
+
const TOML_PATH = path.join(os.homedir(), '.apiclaw.toml');
|
|
14
|
+
// Legacy paths read as fallback (session.ts wrote these)
|
|
15
|
+
const LEGACY_SESSION_DIR = path.join(os.homedir(), '.apiclaw');
|
|
16
|
+
const LEGACY_SESSION_FILE = path.join(LEGACY_SESSION_DIR, 'session');
|
|
17
|
+
const LEGACY_SESSION_JSON = path.join(LEGACY_SESSION_DIR, 'session.json');
|
|
18
|
+
/**
|
|
19
|
+
* Serialize AuthConfig to a Modal-style [default] TOML block.
|
|
20
|
+
* Kept hand-rolled to avoid a runtime dep — schema is fixed and small.
|
|
21
|
+
*/
|
|
22
|
+
function serializeToml(cfg) {
|
|
23
|
+
const lines = ['[default]'];
|
|
24
|
+
const escape = (s) => s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
25
|
+
lines.push(`workspace_id = "${escape(cfg.workspaceId)}"`);
|
|
26
|
+
lines.push(`email = "${escape(cfg.email)}"`);
|
|
27
|
+
lines.push(`session_token = "${escape(cfg.sessionToken)}"`);
|
|
28
|
+
if (cfg.apiKey)
|
|
29
|
+
lines.push(`api_key = "${escape(cfg.apiKey)}"`);
|
|
30
|
+
if (cfg.mcpToken)
|
|
31
|
+
lines.push(`mcp_token = "${escape(cfg.mcpToken)}"`);
|
|
32
|
+
lines.push(`created_at = "${new Date(cfg.createdAt).toISOString()}"`);
|
|
33
|
+
lines.push(`last_used_at = "${new Date(cfg.lastUsedAt ?? cfg.createdAt).toISOString()}"`);
|
|
34
|
+
return lines.join('\n') + '\n';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Minimal TOML parser for the [default] block. Handles double-quoted strings
|
|
38
|
+
* and ISO-8601 datetime strings. No arrays, no nested tables, no comments.
|
|
39
|
+
*/
|
|
40
|
+
function parseToml(text) {
|
|
41
|
+
const out = {};
|
|
42
|
+
let inDefault = false;
|
|
43
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
44
|
+
const line = rawLine.trim();
|
|
45
|
+
if (!line || line.startsWith('#'))
|
|
46
|
+
continue;
|
|
47
|
+
if (line.startsWith('[')) {
|
|
48
|
+
inDefault = line === '[default]';
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (!inDefault)
|
|
52
|
+
continue;
|
|
53
|
+
const eq = line.indexOf('=');
|
|
54
|
+
if (eq < 0)
|
|
55
|
+
continue;
|
|
56
|
+
const key = line.slice(0, eq).trim();
|
|
57
|
+
let val = line.slice(eq + 1).trim();
|
|
58
|
+
if (val.startsWith('"') && val.endsWith('"')) {
|
|
59
|
+
val = val.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
|
60
|
+
}
|
|
61
|
+
out[key] = val;
|
|
62
|
+
}
|
|
63
|
+
if (!out.workspace_id || !out.email || !out.session_token)
|
|
64
|
+
return null;
|
|
65
|
+
const createdAt = out.created_at ? Date.parse(out.created_at) : Date.now();
|
|
66
|
+
const lastUsedAt = out.last_used_at ? Date.parse(out.last_used_at) : createdAt;
|
|
67
|
+
return {
|
|
68
|
+
workspaceId: out.workspace_id,
|
|
69
|
+
email: out.email,
|
|
70
|
+
sessionToken: out.session_token,
|
|
71
|
+
apiKey: out.api_key,
|
|
72
|
+
mcpToken: out.mcp_token,
|
|
73
|
+
createdAt: Number.isNaN(createdAt) ? Date.now() : createdAt,
|
|
74
|
+
lastUsedAt: Number.isNaN(lastUsedAt) ? createdAt : lastUsedAt,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Read auth config. Tries ~/.apiclaw.toml first, then falls back to the
|
|
79
|
+
* legacy JSON files written by older session.ts versions.
|
|
80
|
+
*/
|
|
81
|
+
export function readAuthConfig() {
|
|
82
|
+
try {
|
|
83
|
+
if (fs.existsSync(TOML_PATH)) {
|
|
84
|
+
const text = fs.readFileSync(TOML_PATH, 'utf8');
|
|
85
|
+
const cfg = parseToml(text);
|
|
86
|
+
if (cfg)
|
|
87
|
+
return cfg;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
// fall through to legacy
|
|
92
|
+
}
|
|
93
|
+
// Legacy JSON fallbacks (session.ts format)
|
|
94
|
+
for (const legacyPath of [LEGACY_SESSION_FILE, LEGACY_SESSION_JSON]) {
|
|
95
|
+
try {
|
|
96
|
+
if (!fs.existsSync(legacyPath))
|
|
97
|
+
continue;
|
|
98
|
+
const data = JSON.parse(fs.readFileSync(legacyPath, 'utf8'));
|
|
99
|
+
const sessionToken = data.sessionToken;
|
|
100
|
+
const workspaceId = data.workspaceId;
|
|
101
|
+
const email = data.email;
|
|
102
|
+
if (!sessionToken || !workspaceId || !email)
|
|
103
|
+
continue;
|
|
104
|
+
return {
|
|
105
|
+
sessionToken,
|
|
106
|
+
workspaceId,
|
|
107
|
+
email,
|
|
108
|
+
createdAt: data.createdAt ?? Date.now(),
|
|
109
|
+
lastUsedAt: data.lastUsedAt ?? Date.now(),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
// try next
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Write auth config to ~/.apiclaw.toml with mode 0o600.
|
|
120
|
+
* Best-effort migration: if legacy ~/.apiclaw/session exists, leave it
|
|
121
|
+
* (session.ts continues to read it) so older binaries on the same machine
|
|
122
|
+
* keep working until the next install bump.
|
|
123
|
+
*/
|
|
124
|
+
export function writeAuthConfig(cfg) {
|
|
125
|
+
const toWrite = {
|
|
126
|
+
...cfg,
|
|
127
|
+
lastUsedAt: cfg.lastUsedAt ?? Date.now(),
|
|
128
|
+
};
|
|
129
|
+
fs.writeFileSync(TOML_PATH, serializeToml(toWrite), { mode: 0o600 });
|
|
130
|
+
try {
|
|
131
|
+
fs.chmodSync(TOML_PATH, 0o600);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// best-effort
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Update only lastUsedAt without rewriting the rest. Useful for the MCP
|
|
139
|
+
* server's session-touch on each call.
|
|
140
|
+
*/
|
|
141
|
+
export function touchAuthConfig() {
|
|
142
|
+
const cfg = readAuthConfig();
|
|
143
|
+
if (!cfg)
|
|
144
|
+
return;
|
|
145
|
+
writeAuthConfig({ ...cfg, lastUsedAt: Date.now() });
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Clear ~/.apiclaw.toml (and the legacy files). Used by `apiclaw auth logout`.
|
|
149
|
+
*/
|
|
150
|
+
export function clearAuthConfig() {
|
|
151
|
+
for (const p of [TOML_PATH, LEGACY_SESSION_FILE, LEGACY_SESSION_JSON]) {
|
|
152
|
+
try {
|
|
153
|
+
if (fs.existsSync(p))
|
|
154
|
+
fs.unlinkSync(p);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// best-effort
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export const AUTH_CONFIG_PATH = TOML_PATH;
|
|
162
|
+
//# sourceMappingURL=auth-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-config.js","sourceRoot":"","sources":["../src/auth-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAYzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAE3D,yDAAyD;AACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/D,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;AACrE,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAE1E;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAe;IACpC,MAAM,KAAK,GAAa,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChE,IAAI,GAAG,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,SAAS,GAAG,IAAI,KAAK,WAAW,CAAC;YACjC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3E,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;QAC3D,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KAC9D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yBAAyB;IAC3B,CAAC;IAED,4CAA4C;IAC5C,KAAK,MAAM,UAAU,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,SAAS;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAA4B,CAAC;YACxF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAkC,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAiC,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAA2B,CAAC;YAC/C,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK;gBAAE,SAAS;YACtD,OAAO;gBACL,YAAY;gBACZ,WAAW;gBACX,KAAK;gBACL,SAAS,EAAG,IAAI,CAAC,SAAgC,IAAI,IAAI,CAAC,GAAG,EAAE;gBAC/D,UAAU,EAAG,IAAI,CAAC,UAAiC,IAAI,IAAI,CAAC,GAAG,EAAE;aAClE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAe;IAC7C,MAAM,OAAO,GAAe;QAC1B,GAAG,GAAG;QACN,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE;KACzC,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,eAAe,CAAC,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-config.test.d.ts","sourceRoot":"","sources":["../src/auth-config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for ~/.apiclaw.toml read/write helpers.
|
|
3
|
+
* Run: npx tsx src/auth-config.test.ts
|
|
4
|
+
*
|
|
5
|
+
* Uses a temp HOME via mocking — the helpers respect os.homedir() so we
|
|
6
|
+
* temporarily override it via env+setter.
|
|
7
|
+
*/
|
|
8
|
+
import { strict as assert } from 'node:assert';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import * as os from 'os';
|
|
12
|
+
const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'apiclaw-test-'));
|
|
13
|
+
// os.homedir() on POSIX prefers $HOME if set; on win32 it uses $USERPROFILE.
|
|
14
|
+
// Set both BEFORE importing the module so AUTH_CONFIG_PATH resolves under tmp.
|
|
15
|
+
process.env.HOME = tmpHome;
|
|
16
|
+
process.env.USERPROFILE = tmpHome;
|
|
17
|
+
let failed = 0;
|
|
18
|
+
let passed = 0;
|
|
19
|
+
async function test(name, fn) {
|
|
20
|
+
try {
|
|
21
|
+
await fn();
|
|
22
|
+
console.log(`✅ ${name}`);
|
|
23
|
+
passed++;
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
console.error(`❌ ${name}`);
|
|
27
|
+
console.error(` ${err.message}`);
|
|
28
|
+
failed++;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function run() {
|
|
32
|
+
const mod = await import('./auth-config.js');
|
|
33
|
+
const { readAuthConfig, writeAuthConfig, clearAuthConfig, touchAuthConfig, AUTH_CONFIG_PATH } = mod;
|
|
34
|
+
await test('AUTH_CONFIG_PATH resolves under tmp home', () => {
|
|
35
|
+
assert.equal(AUTH_CONFIG_PATH, path.join(tmpHome, '.apiclaw.toml'));
|
|
36
|
+
});
|
|
37
|
+
await test('readAuthConfig returns null when no file exists', () => {
|
|
38
|
+
clearAuthConfig();
|
|
39
|
+
assert.equal(readAuthConfig(), null);
|
|
40
|
+
});
|
|
41
|
+
await test('writeAuthConfig + readAuthConfig roundtrip preserves all fields', () => {
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
writeAuthConfig({
|
|
44
|
+
workspaceId: 'ws_test123',
|
|
45
|
+
email: 'agent@nordsym.com',
|
|
46
|
+
sessionToken: 'st_secret',
|
|
47
|
+
apiKey: 'sk-claw-abc123',
|
|
48
|
+
mcpToken: 'sk-mcp-xyz789',
|
|
49
|
+
createdAt: now,
|
|
50
|
+
lastUsedAt: now,
|
|
51
|
+
});
|
|
52
|
+
const got = readAuthConfig();
|
|
53
|
+
assert(got, 'expected readAuthConfig to return a value');
|
|
54
|
+
assert.equal(got.workspaceId, 'ws_test123');
|
|
55
|
+
assert.equal(got.email, 'agent@nordsym.com');
|
|
56
|
+
assert.equal(got.sessionToken, 'st_secret');
|
|
57
|
+
assert.equal(got.apiKey, 'sk-claw-abc123');
|
|
58
|
+
assert.equal(got.mcpToken, 'sk-mcp-xyz789');
|
|
59
|
+
// Timestamps roundtrip via ISO strings — millisecond-precision tolerated.
|
|
60
|
+
assert(Math.abs(got.createdAt - now) < 1000, 'createdAt should roundtrip within 1s');
|
|
61
|
+
});
|
|
62
|
+
await test('writeAuthConfig sets mode 0o600', () => {
|
|
63
|
+
writeAuthConfig({
|
|
64
|
+
workspaceId: 'ws_perm',
|
|
65
|
+
email: 'p@x.com',
|
|
66
|
+
sessionToken: 'st_perm',
|
|
67
|
+
createdAt: Date.now(),
|
|
68
|
+
});
|
|
69
|
+
const stat = fs.statSync(AUTH_CONFIG_PATH);
|
|
70
|
+
// Mask to permission bits, compare against 0o600.
|
|
71
|
+
assert.equal(stat.mode & 0o777, 0o600);
|
|
72
|
+
});
|
|
73
|
+
await test('writeAuthConfig handles missing optional fields', () => {
|
|
74
|
+
writeAuthConfig({
|
|
75
|
+
workspaceId: 'ws_minimal',
|
|
76
|
+
email: 'm@x.com',
|
|
77
|
+
sessionToken: 'st_minimal',
|
|
78
|
+
createdAt: Date.now(),
|
|
79
|
+
});
|
|
80
|
+
const got = readAuthConfig();
|
|
81
|
+
assert(got);
|
|
82
|
+
assert.equal(got.apiKey, undefined);
|
|
83
|
+
assert.equal(got.mcpToken, undefined);
|
|
84
|
+
});
|
|
85
|
+
await test('touchAuthConfig updates lastUsedAt without losing other fields', async () => {
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
writeAuthConfig({
|
|
88
|
+
workspaceId: 'ws_touch',
|
|
89
|
+
email: 't@x.com',
|
|
90
|
+
sessionToken: 'st_touch',
|
|
91
|
+
apiKey: 'sk-claw-touch',
|
|
92
|
+
createdAt: now,
|
|
93
|
+
lastUsedAt: now - 100000,
|
|
94
|
+
});
|
|
95
|
+
// wait 1.5s so ISO seconds change
|
|
96
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
97
|
+
touchAuthConfig();
|
|
98
|
+
const got = readAuthConfig();
|
|
99
|
+
assert(got);
|
|
100
|
+
assert.equal(got.workspaceId, 'ws_touch');
|
|
101
|
+
assert.equal(got.apiKey, 'sk-claw-touch');
|
|
102
|
+
assert(got.lastUsedAt && got.lastUsedAt > now - 1000, 'lastUsedAt should be recent');
|
|
103
|
+
});
|
|
104
|
+
await test('clearAuthConfig removes the file', () => {
|
|
105
|
+
writeAuthConfig({
|
|
106
|
+
workspaceId: 'ws_clr',
|
|
107
|
+
email: 'c@x.com',
|
|
108
|
+
sessionToken: 'st_clr',
|
|
109
|
+
createdAt: Date.now(),
|
|
110
|
+
});
|
|
111
|
+
assert(fs.existsSync(AUTH_CONFIG_PATH));
|
|
112
|
+
clearAuthConfig();
|
|
113
|
+
assert(!fs.existsSync(AUTH_CONFIG_PATH));
|
|
114
|
+
});
|
|
115
|
+
await test('readAuthConfig falls back to legacy ~/.apiclaw/session JSON file', () => {
|
|
116
|
+
clearAuthConfig();
|
|
117
|
+
const legacyDir = path.join(tmpHome, '.apiclaw');
|
|
118
|
+
fs.mkdirSync(legacyDir, { recursive: true, mode: 0o700 });
|
|
119
|
+
fs.writeFileSync(path.join(legacyDir, 'session'), JSON.stringify({
|
|
120
|
+
workspaceId: 'ws_legacy',
|
|
121
|
+
email: 'legacy@x.com',
|
|
122
|
+
sessionToken: 'st_legacy',
|
|
123
|
+
createdAt: 1234567890000,
|
|
124
|
+
}), { mode: 0o600 });
|
|
125
|
+
const got = readAuthConfig();
|
|
126
|
+
assert(got, 'legacy fallback should return a value');
|
|
127
|
+
assert.equal(got.workspaceId, 'ws_legacy');
|
|
128
|
+
assert.equal(got.email, 'legacy@x.com');
|
|
129
|
+
// Cleanup
|
|
130
|
+
fs.rmSync(legacyDir, { recursive: true, force: true });
|
|
131
|
+
});
|
|
132
|
+
await test('parseToml handles escaped quotes in values', () => {
|
|
133
|
+
fs.writeFileSync(AUTH_CONFIG_PATH, `[default]\nworkspace_id = "ws_q"\nemail = "with\\"quote@x.com"\nsession_token = "s\\\\\\\\t"\ncreated_at = "2026-05-18T10:00:00.000Z"\nlast_used_at = "2026-05-18T10:00:00.000Z"\n`, { mode: 0o600 });
|
|
134
|
+
const got = readAuthConfig();
|
|
135
|
+
assert(got);
|
|
136
|
+
assert.equal(got.email, 'with"quote@x.com');
|
|
137
|
+
});
|
|
138
|
+
await test('readAuthConfig returns null for malformed TOML missing required fields', () => {
|
|
139
|
+
clearAuthConfig();
|
|
140
|
+
fs.writeFileSync(AUTH_CONFIG_PATH, `[default]\nemail = "only@x.com"\n`, { mode: 0o600 });
|
|
141
|
+
assert.equal(readAuthConfig(), null);
|
|
142
|
+
});
|
|
143
|
+
// Cleanup
|
|
144
|
+
fs.rmSync(tmpHome, { recursive: true, force: true });
|
|
145
|
+
console.log(`\n${passed} passed, ${failed} failed`);
|
|
146
|
+
if (failed > 0)
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
run().catch((err) => {
|
|
150
|
+
console.error('Test runner crashed:', err);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=auth-config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-config.test.js","sourceRoot":"","sources":["../src/auth-config.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;AACxE,6EAA6E;AAC7E,+EAA+E;AAC/E,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;AAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;AAElC,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,IAAI,MAAM,GAAG,CAAC,CAAC;AAEf,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,EAA8B;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC7C,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC;IAEpG,MAAM,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACjE,eAAe,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACjF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,eAAe,CAAC;YACd,WAAW,EAAE,YAAY;YACzB,KAAK,EAAE,mBAAmB;YAC1B,YAAY,EAAE,WAAW;YACzB,MAAM,EAAE,gBAAgB;YACxB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC5C,0EAA0E;QAC1E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,sCAAsC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACjD,eAAe,CAAC;YACd,WAAW,EAAE,SAAS;YACtB,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,SAAS;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC3C,kDAAkD;QAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACjE,eAAe,CAAC;YACd,WAAW,EAAE,YAAY;YACzB,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,YAAY;YAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,eAAe,CAAC;YACd,WAAW,EAAE,UAAU;YACvB,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,UAAU;YACxB,MAAM,EAAE,eAAe;YACvB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,GAAG,GAAG,MAAM;SACzB,CAAC,CAAC;QACH,kCAAkC;QAClC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,eAAe,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,EAAE,6BAA6B,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAClD,eAAe,CAAC;YACd,WAAW,EAAE,QAAQ;YACrB,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACxC,eAAe,EAAE,CAAC;QAClB,MAAM,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAClF,eAAe,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAC/B,IAAI,CAAC,SAAS,CAAC;YACb,WAAW,EAAE,WAAW;YACxB,KAAK,EAAE,cAAc;YACrB,YAAY,EAAE,WAAW;YACzB,SAAS,EAAE,aAAa;SACzB,CAAC,EACF,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;QACF,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACxC,UAAU;QACV,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAC5D,EAAE,CAAC,aAAa,CACd,gBAAgB,EAChB,oLAAoL,EACpL,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;QACF,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QACxF,eAAe,EAAE,CAAC;QAClB,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,mCAAmC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,UAAU;IACV,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,YAAY,MAAM,SAAS,CAAC,CAAC;IACpD,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/bin.js
CHANGED
|
@@ -7,14 +7,18 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync } from 'fs';
|
|
9
9
|
import { join } from 'path';
|
|
10
|
-
const cliCommands = ['setup', 'login', 'demo', 'mcp-install', 'mcp-uninstall', 'doctor', 'restore', 'uninstall', 'mission', 'discover', 'call', 'details', 'balance', 'help', '--help', '-h', '--version', '-V'];
|
|
10
|
+
const cliCommands = ['auth', 'setup', 'login', 'demo', 'mcp-install', 'mcp-uninstall', 'doctor', 'restore', 'uninstall', 'mission', 'discover', 'call', 'details', 'balance', 'help', '--help', '-h', '--version', '-V'];
|
|
11
11
|
const firstArg = process.argv[2];
|
|
12
12
|
if (!firstArg || !cliCommands.includes(firstArg)) {
|
|
13
|
-
// First-run nudge: non-blocking hint if no workspace is configured
|
|
13
|
+
// First-run nudge: non-blocking hint if no workspace is configured.
|
|
14
|
+
// Checks both the new ~/.apiclaw.toml (A-22 canonical) and the legacy
|
|
15
|
+
// ~/.apiclaw/session file so existing installs keep their state.
|
|
14
16
|
try {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
const home = process.env.HOME ?? '~';
|
|
18
|
+
const tomlFile = join(home, '.apiclaw.toml');
|
|
19
|
+
const legacySessionFile = join(home, '.apiclaw', 'session');
|
|
20
|
+
if (!existsSync(tomlFile) && !existsSync(legacySessionFile)) {
|
|
21
|
+
process.stderr.write('\x1b[33m💡 No workspace linked. Run: npx @nordsym/apiclaw auth login\x1b[0m\n');
|
|
18
22
|
}
|
|
19
23
|
}
|
|
20
24
|
catch {
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AAEzN,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEjC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjD,oEAAoE;IACpE,sEAAsE;IACtE,iEAAiE;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+EAA+E,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,iBAAiB;IACjB,MAAM,CAAC,YAAY,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,UAAU;IACV,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { executeAPICall } from './execute.js';
|
|
6
6
|
import { logAPICall } from './mcp-analytics.js';
|
|
7
7
|
// Convex HTTP API for capability queries
|
|
8
|
-
const CONVEX_URL = process.env.NEXT_PUBLIC_CONVEX_URL || 'https://
|
|
8
|
+
const CONVEX_URL = process.env.NEXT_PUBLIC_CONVEX_URL || 'https://adventurous-avocet-799.convex.cloud';
|
|
9
9
|
/**
|
|
10
10
|
* Query Convex for providers that support a capability
|
|
11
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-router.js","sourceRoot":"","sources":["../src/capability-router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,yCAAyC;AACzC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,
|
|
1
|
+
{"version":3,"file":"capability-router.js","sourceRoot":"","sources":["../src/capability-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw CLI auth — browser-loopback flow (Modal/gh/vercel pattern).
|
|
3
|
+
*
|
|
4
|
+
* `apiclaw auth login`
|
|
5
|
+
* 1. Generate PKCE verifier + challenge, random state.
|
|
6
|
+
* 2. Start ephemeral HTTP listener on an OS-assigned port.
|
|
7
|
+
* 3. POST cliAuth:start to Convex → get {authId, browserUrl}.
|
|
8
|
+
* 4. Open browserUrl in default browser (open / xdg-open / start).
|
|
9
|
+
* 5. Wait for /callback?code=X&state=Y on loopback (max 5 min).
|
|
10
|
+
* 6. Validate state, POST cliAuth:exchange with {code, codeVerifier} → session+key.
|
|
11
|
+
* 7. Write ~/.apiclaw.toml, verify, print success + next-step hints.
|
|
12
|
+
*
|
|
13
|
+
* Email fallback: --email-fallback delegates to the existing magic-link
|
|
14
|
+
* loginCommand for headless/SSH users.
|
|
15
|
+
*/
|
|
16
|
+
import { type AuthConfig } from '../../auth-config.js';
|
|
17
|
+
interface AuthLoginOptions {
|
|
18
|
+
emailFallback?: boolean;
|
|
19
|
+
printMcpToken?: boolean;
|
|
20
|
+
force?: boolean;
|
|
21
|
+
noOpen?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function authLoginCommand(options?: AuthLoginOptions): Promise<AuthConfig | null>;
|
|
24
|
+
export declare function authLogoutCommand(): Promise<void>;
|
|
25
|
+
export declare function authWhoamiCommand(): Promise<void>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,EAAsE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAW3H,UAAU,gBAAgB;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA6KD,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAqJjG;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQvD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAcvD"}
|