akadmin 0.1.0 → 0.1.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/dist/index.js +375 -284
- package/dist/index.js.map +3 -3
- package/package.json +10 -1
- package/dist/commands/audit.d.ts +0 -7
- package/dist/commands/audit.d.ts.map +0 -1
- package/dist/commands/audit.js +0 -35
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/auth.d.ts +0 -8
- package/dist/commands/auth.d.ts.map +0 -1
- package/dist/commands/auth.js +0 -156
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/discover.d.ts +0 -6
- package/dist/commands/discover.d.ts.map +0 -1
- package/dist/commands/discover.js +0 -94
- package/dist/commands/discover.js.map +0 -1
- package/dist/commands/domain.d.ts +0 -7
- package/dist/commands/domain.d.ts.map +0 -1
- package/dist/commands/domain.js +0 -104
- package/dist/commands/domain.js.map +0 -1
- package/dist/commands/raw.d.ts +0 -7
- package/dist/commands/raw.d.ts.map +0 -1
- package/dist/commands/raw.js +0 -90
- package/dist/commands/raw.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/keychain/index.d.ts +0 -44
- package/dist/keychain/index.d.ts.map +0 -1
- package/dist/keychain/index.js +0 -173
- package/dist/keychain/index.js.map +0 -1
- package/dist/storage/file-store.d.ts +0 -19
- package/dist/storage/file-store.d.ts.map +0 -1
- package/dist/storage/file-store.js +0 -79
- package/dist/storage/file-store.js.map +0 -1
package/dist/keychain/index.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local Encrypted Credential & Profile Manager for akadmin CLI.
|
|
3
|
-
* Encrypts credentials with AES-256-GCM using machine-derived master keys.
|
|
4
|
-
* Non-secret configuration is kept separate in config.json.
|
|
5
|
-
*/
|
|
6
|
-
export interface ProfileCredentials {
|
|
7
|
-
apiKey?: string;
|
|
8
|
-
sessionCookie?: string;
|
|
9
|
-
baseUrl?: string;
|
|
10
|
-
}
|
|
11
|
-
export interface CliConfig {
|
|
12
|
-
activeProfile: string;
|
|
13
|
-
profiles: Record<string, {
|
|
14
|
-
baseUrl: string;
|
|
15
|
-
maskedKey?: string;
|
|
16
|
-
hasSessionCookie?: boolean;
|
|
17
|
-
}>;
|
|
18
|
-
}
|
|
19
|
-
export declare class CliKeychain {
|
|
20
|
-
private configDir;
|
|
21
|
-
private configFile;
|
|
22
|
-
private vaultFile;
|
|
23
|
-
private masterKeySecret;
|
|
24
|
-
constructor(customDir?: string);
|
|
25
|
-
getConfigDir(): string;
|
|
26
|
-
getSigningSecret(): string;
|
|
27
|
-
private ensureConfig;
|
|
28
|
-
private saveConfig;
|
|
29
|
-
private readEncryptedVault;
|
|
30
|
-
private writeEncryptedVault;
|
|
31
|
-
getActiveProfile(): string;
|
|
32
|
-
setActiveProfile(profile: string): void;
|
|
33
|
-
getCredentials(profile?: string): Promise<ProfileCredentials>;
|
|
34
|
-
setApiKey(apiKey: string, profile?: string): Promise<void>;
|
|
35
|
-
setSessionCookie(sessionCookie: string, profile?: string): Promise<void>;
|
|
36
|
-
getStatus(): Promise<{
|
|
37
|
-
activeProfile: string;
|
|
38
|
-
hasApiKey: boolean;
|
|
39
|
-
maskedKey?: string;
|
|
40
|
-
hasSessionCookie: boolean;
|
|
41
|
-
baseUrl: string;
|
|
42
|
-
}>;
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/keychain/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/F;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAS;gBAEpB,SAAS,CAAC,EAAE,MAAM;IAU9B,YAAY,IAAI,MAAM;IAItB,gBAAgB,IAAI,MAAM;IAI1B,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,mBAAmB;IAO3B,gBAAgB,IAAI,MAAM;IAO1B,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWjC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuC7D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1D,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxE,SAAS,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAW1I"}
|
package/dist/keychain/index.js
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local Encrypted Credential & Profile Manager for akadmin CLI.
|
|
3
|
-
* Encrypts credentials with AES-256-GCM using machine-derived master keys.
|
|
4
|
-
* Non-secret configuration is kept separate in config.json.
|
|
5
|
-
*/
|
|
6
|
-
import fs from "node:fs";
|
|
7
|
-
import os from "node:os";
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
import { decryptFromVault, encryptForVault, maskApiKey, } from "@akadmin/core";
|
|
10
|
-
export class CliKeychain {
|
|
11
|
-
configDir;
|
|
12
|
-
configFile;
|
|
13
|
-
vaultFile;
|
|
14
|
-
masterKeySecret;
|
|
15
|
-
constructor(customDir) {
|
|
16
|
-
this.configDir = customDir || path.join(os.homedir(), ".config", "akadmin");
|
|
17
|
-
this.configFile = path.join(this.configDir, "config.json");
|
|
18
|
-
this.vaultFile = path.join(this.configDir, "credentials.enc");
|
|
19
|
-
// Derive machine-bound master secret for local envelope encryption
|
|
20
|
-
const machineEntropy = `${os.userInfo().username}@${os.hostname()}-akadmin-cli-v1`;
|
|
21
|
-
this.masterKeySecret = machineEntropy;
|
|
22
|
-
}
|
|
23
|
-
getConfigDir() {
|
|
24
|
-
return this.configDir;
|
|
25
|
-
}
|
|
26
|
-
getSigningSecret() {
|
|
27
|
-
return `cli-signing-${this.masterKeySecret}`;
|
|
28
|
-
}
|
|
29
|
-
ensureConfig() {
|
|
30
|
-
if (!fs.existsSync(this.configFile)) {
|
|
31
|
-
const defaultConf = {
|
|
32
|
-
activeProfile: "production",
|
|
33
|
-
profiles: {
|
|
34
|
-
production: { baseUrl: "https://agentkit.best" },
|
|
35
|
-
staging: { baseUrl: "https://staging.agentkit.best" },
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
fs.mkdirSync(this.configDir, { recursive: true, mode: 0o700 });
|
|
39
|
-
fs.writeFileSync(this.configFile, JSON.stringify(defaultConf, null, 2), {
|
|
40
|
-
mode: 0o600,
|
|
41
|
-
});
|
|
42
|
-
return defaultConf;
|
|
43
|
-
}
|
|
44
|
-
try {
|
|
45
|
-
return JSON.parse(fs.readFileSync(this.configFile, "utf-8"));
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return {
|
|
49
|
-
activeProfile: "production",
|
|
50
|
-
profiles: {},
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
saveConfig(config) {
|
|
55
|
-
fs.mkdirSync(this.configDir, { recursive: true, mode: 0o700 });
|
|
56
|
-
fs.writeFileSync(this.configFile, JSON.stringify(config, null, 2), {
|
|
57
|
-
mode: 0o600,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
readEncryptedVault() {
|
|
61
|
-
if (!fs.existsSync(this.vaultFile)) {
|
|
62
|
-
return {};
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
return JSON.parse(fs.readFileSync(this.vaultFile, "utf-8"));
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return {};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
writeEncryptedVault(data) {
|
|
72
|
-
fs.mkdirSync(this.configDir, { recursive: true, mode: 0o700 });
|
|
73
|
-
fs.writeFileSync(this.vaultFile, JSON.stringify(data, null, 2), {
|
|
74
|
-
mode: 0o600,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
getActiveProfile() {
|
|
78
|
-
const envProfile = process.env["AKADMIN_PROFILE"];
|
|
79
|
-
if (envProfile)
|
|
80
|
-
return envProfile;
|
|
81
|
-
const config = this.ensureConfig();
|
|
82
|
-
return config.activeProfile || "production";
|
|
83
|
-
}
|
|
84
|
-
setActiveProfile(profile) {
|
|
85
|
-
const config = this.ensureConfig();
|
|
86
|
-
config.activeProfile = profile;
|
|
87
|
-
if (!config.profiles[profile]) {
|
|
88
|
-
config.profiles[profile] = {
|
|
89
|
-
baseUrl: profile === "production" ? "https://agentkit.best" : "https://staging.agentkit.best",
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
this.saveConfig(config);
|
|
93
|
-
}
|
|
94
|
-
async getCredentials(profile) {
|
|
95
|
-
const targetProfile = profile || this.getActiveProfile();
|
|
96
|
-
const config = this.ensureConfig();
|
|
97
|
-
const profileMeta = config.profiles[targetProfile] || { baseUrl: "https://agentkit.best" };
|
|
98
|
-
const envApiKey = process.env["AKADMIN_API_KEY"] || process.env["AGENTKIT_ADMIN_KEY"];
|
|
99
|
-
const envSession = process.env["AKADMIN_SESSION_COOKIE"];
|
|
100
|
-
const envBaseUrl = process.env["AKADMIN_BASE_URL"];
|
|
101
|
-
let apiKey = envApiKey;
|
|
102
|
-
let sessionCookie = envSession;
|
|
103
|
-
// Read from encrypted vault if not in env
|
|
104
|
-
const vault = this.readEncryptedVault();
|
|
105
|
-
const apiKeyRecord = vault[`${targetProfile}:apiKey`];
|
|
106
|
-
if (!apiKey && apiKeyRecord) {
|
|
107
|
-
try {
|
|
108
|
-
apiKey = await decryptFromVault(apiKeyRecord, "cli_operator", this.masterKeySecret);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
// Decryption failed or tampered
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
const sessionRecord = vault[`${targetProfile}:sessionCookie`];
|
|
115
|
-
if (!sessionCookie && sessionRecord) {
|
|
116
|
-
try {
|
|
117
|
-
sessionCookie = await decryptFromVault(sessionRecord, "cli_operator", this.masterKeySecret);
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
// Decryption failed
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return {
|
|
124
|
-
apiKey,
|
|
125
|
-
sessionCookie,
|
|
126
|
-
baseUrl: envBaseUrl || profileMeta.baseUrl || (targetProfile === "production" ? "https://agentkit.best" : "https://staging.agentkit.best"),
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
async setApiKey(apiKey, profile) {
|
|
130
|
-
const targetProfile = profile || this.getActiveProfile();
|
|
131
|
-
const config = this.ensureConfig();
|
|
132
|
-
if (!config.profiles[targetProfile]) {
|
|
133
|
-
config.profiles[targetProfile] = {
|
|
134
|
-
baseUrl: targetProfile === "production" ? "https://agentkit.best" : "https://staging.agentkit.best",
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
config.profiles[targetProfile].maskedKey = maskApiKey(apiKey);
|
|
138
|
-
this.saveConfig(config);
|
|
139
|
-
// Encrypt into vault file (0600)
|
|
140
|
-
const record = await encryptForVault(apiKey, "cli_operator", this.masterKeySecret, 1);
|
|
141
|
-
const vault = this.readEncryptedVault();
|
|
142
|
-
vault[`${targetProfile}:apiKey`] = record;
|
|
143
|
-
this.writeEncryptedVault(vault);
|
|
144
|
-
}
|
|
145
|
-
async setSessionCookie(sessionCookie, profile) {
|
|
146
|
-
const targetProfile = profile || this.getActiveProfile();
|
|
147
|
-
const config = this.ensureConfig();
|
|
148
|
-
if (!config.profiles[targetProfile]) {
|
|
149
|
-
config.profiles[targetProfile] = {
|
|
150
|
-
baseUrl: targetProfile === "production" ? "https://agentkit.best" : "https://staging.agentkit.best",
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
config.profiles[targetProfile].hasSessionCookie = true;
|
|
154
|
-
this.saveConfig(config);
|
|
155
|
-
// Encrypt into vault file (0600)
|
|
156
|
-
const record = await encryptForVault(sessionCookie, "cli_operator", this.masterKeySecret, 1);
|
|
157
|
-
const vault = this.readEncryptedVault();
|
|
158
|
-
vault[`${targetProfile}:sessionCookie`] = record;
|
|
159
|
-
this.writeEncryptedVault(vault);
|
|
160
|
-
}
|
|
161
|
-
async getStatus() {
|
|
162
|
-
const profile = this.getActiveProfile();
|
|
163
|
-
const creds = await this.getCredentials(profile);
|
|
164
|
-
return {
|
|
165
|
-
activeProfile: profile,
|
|
166
|
-
hasApiKey: Boolean(creds.apiKey),
|
|
167
|
-
maskedKey: creds.apiKey ? maskApiKey(creds.apiKey) : undefined,
|
|
168
|
-
hasSessionCookie: Boolean(creds.sessionCookie),
|
|
169
|
-
baseUrl: creds.baseUrl || "https://agentkit.best",
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/keychain/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persistent file-backed storage adapters for CLI NonceStore and AuditStore.
|
|
3
|
-
* Ensures cross-process single-use replay protection and append-only audit logs.
|
|
4
|
-
*/
|
|
5
|
-
import { type AuditRecord, type AuditStore, type NonceStore } from "@akadmin/core";
|
|
6
|
-
export declare class FileNonceStore implements NonceStore {
|
|
7
|
-
private filePath;
|
|
8
|
-
constructor(baseDir: string);
|
|
9
|
-
private readNonces;
|
|
10
|
-
private writeNonces;
|
|
11
|
-
claim(nonce: string, ttlSeconds: number): Promise<boolean>;
|
|
12
|
-
}
|
|
13
|
-
export declare class FileAuditStore implements AuditStore {
|
|
14
|
-
private filePath;
|
|
15
|
-
constructor(baseDir: string);
|
|
16
|
-
append(record: AuditRecord): Promise<void>;
|
|
17
|
-
list(limit?: number): Promise<AuditRecord[]>;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/storage/file-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAgB,MAAM,eAAe,CAAC;AAEjG,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM;IAI3B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,WAAW;IAMb,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAsBjE;AAED,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM;IAIrB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C,IAAI,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAmB/C"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persistent file-backed storage adapters for CLI NonceStore and AuditStore.
|
|
3
|
-
* Ensures cross-process single-use replay protection and append-only audit logs.
|
|
4
|
-
*/
|
|
5
|
-
import fs from "node:fs";
|
|
6
|
-
import path from "node:path";
|
|
7
|
-
import { redactObject } from "@akadmin/core";
|
|
8
|
-
export class FileNonceStore {
|
|
9
|
-
filePath;
|
|
10
|
-
constructor(baseDir) {
|
|
11
|
-
this.filePath = path.join(baseDir, "nonces.json");
|
|
12
|
-
}
|
|
13
|
-
readNonces() {
|
|
14
|
-
if (!fs.existsSync(this.filePath)) {
|
|
15
|
-
return {};
|
|
16
|
-
}
|
|
17
|
-
try {
|
|
18
|
-
return JSON.parse(fs.readFileSync(this.filePath, "utf-8"));
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return {};
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
writeNonces(data) {
|
|
25
|
-
const dir = path.dirname(this.filePath);
|
|
26
|
-
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
27
|
-
fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
28
|
-
}
|
|
29
|
-
async claim(nonce, ttlSeconds) {
|
|
30
|
-
const now = Date.now();
|
|
31
|
-
const nonces = this.readNonces();
|
|
32
|
-
// 1. Prune expired nonces
|
|
33
|
-
const activeNonces = {};
|
|
34
|
-
for (const [n, exp] of Object.entries(nonces)) {
|
|
35
|
-
if (exp > now) {
|
|
36
|
-
activeNonces[n] = exp;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
// 2. Check if nonce already consumed
|
|
40
|
-
if (activeNonces[nonce]) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
// 3. Atomically record nonce
|
|
44
|
-
activeNonces[nonce] = now + ttlSeconds * 1000;
|
|
45
|
-
this.writeNonces(activeNonces);
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
export class FileAuditStore {
|
|
50
|
-
filePath;
|
|
51
|
-
constructor(baseDir) {
|
|
52
|
-
this.filePath = path.join(baseDir, "audit.log");
|
|
53
|
-
}
|
|
54
|
-
async append(record) {
|
|
55
|
-
const dir = path.dirname(this.filePath);
|
|
56
|
-
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
57
|
-
const sanitized = redactObject(record);
|
|
58
|
-
const line = `${JSON.stringify(sanitized)}\n`;
|
|
59
|
-
fs.appendFileSync(this.filePath, line, { mode: 0o600 });
|
|
60
|
-
}
|
|
61
|
-
async list(limit = 50) {
|
|
62
|
-
if (!fs.existsSync(this.filePath)) {
|
|
63
|
-
return [];
|
|
64
|
-
}
|
|
65
|
-
const content = fs.readFileSync(this.filePath, "utf-8");
|
|
66
|
-
const lines = content.split("\n").filter((l) => l.trim().length > 0);
|
|
67
|
-
const records = [];
|
|
68
|
-
for (const line of lines.slice(-limit)) {
|
|
69
|
-
try {
|
|
70
|
-
records.push(JSON.parse(line));
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// Skip malformed lines
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return records.reverse();
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=file-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/storage/file-store.ts"],"names":[],"mappings":"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"}
|