@the-17/agentsecrets 1.1.4 → 3.0.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 +1 -1
- package/bin/agentsecrets.js +185 -166
- package/index.js +27 -0
- package/package.json +2 -2
package/README.md
CHANGED
package/bin/agentsecrets.js
CHANGED
|
@@ -1,166 +1,185 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const { spawn } = require('child_process');
|
|
7
|
-
const https = require('https');
|
|
8
|
-
const tar = require('tar');
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const { spawn } = require('child_process');
|
|
7
|
+
const https = require('https');
|
|
8
|
+
const tar = require('tar');
|
|
9
|
+
|
|
10
|
+
const PACKAGE_JSON = require('../package.json');
|
|
11
|
+
const VERSION = PACKAGE_JSON.version;
|
|
12
|
+
const GITHUB_REPO = "The-17/agentsecrets";
|
|
13
|
+
|
|
14
|
+
function getPlatformInfo() {
|
|
15
|
+
const type = os.type();
|
|
16
|
+
const arch = os.arch();
|
|
17
|
+
|
|
18
|
+
let os_name = '';
|
|
19
|
+
if (type === 'Darwin') os_name = 'darwin';
|
|
20
|
+
else if (type === 'Linux') os_name = 'linux';
|
|
21
|
+
else if (type === 'Windows_NT') os_name = 'windows';
|
|
22
|
+
|
|
23
|
+
let arch_name = '';
|
|
24
|
+
if (arch === 'x64') arch_name = 'amd64';
|
|
25
|
+
else if (arch === 'arm64') arch_name = 'arm64';
|
|
26
|
+
else if (arch === 'ia32') arch_name = '386';
|
|
27
|
+
|
|
28
|
+
return { os_name, arch_name };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function downloadBinary(url, dest, isZip = false) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
https.get(url, (res) => {
|
|
34
|
+
if (res.statusCode === 302 || res.statusCode === 301) {
|
|
35
|
+
const nextIsZip = isZip || url.split('?')[0].endsWith('.zip');
|
|
36
|
+
return downloadBinary(res.headers.location, dest, nextIsZip).then(resolve).catch(reject);
|
|
37
|
+
}
|
|
38
|
+
if (res.statusCode !== 200) {
|
|
39
|
+
return reject(new Error(`Failed to download: ${res.statusCode}`));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const tempDir = path.join(os.tmpdir(), `agentsecrets-${Date.now()}`);
|
|
43
|
+
fs.mkdirSync(tempDir, { recursive: true });
|
|
44
|
+
|
|
45
|
+
const isWin = isZip || url.split('?')[0].endsWith('.zip');
|
|
46
|
+
if (isWin) {
|
|
47
|
+
const zipPath = path.join(tempDir, 'archive.zip');
|
|
48
|
+
const fileStream = fs.createWriteStream(zipPath);
|
|
49
|
+
res.pipe(fileStream);
|
|
50
|
+
fileStream.on('finish', () => {
|
|
51
|
+
fileStream.close(() => {
|
|
52
|
+
const { execSync } = require('child_process');
|
|
53
|
+
try {
|
|
54
|
+
// Use ErrorActionPreference = Stop so PowerShell errors trigger execSync failure
|
|
55
|
+
execSync('powershell.exe -NoProfile -Command "$ErrorActionPreference = \'Stop\'; Expand-Archive -Path \'' + zipPath + '\' -DestinationPath \'' + tempDir + '\' -Force"', { stdio: 'pipe' });
|
|
56
|
+
const binaryName = 'agentsecrets.exe';
|
|
57
|
+
const src = path.join(tempDir, binaryName);
|
|
58
|
+
if (fs.existsSync(src)) {
|
|
59
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
60
|
+
fs.renameSync(src, dest);
|
|
61
|
+
resolve();
|
|
62
|
+
} else {
|
|
63
|
+
reject(new Error('Binary ' + binaryName + ' not found in zip archive'));
|
|
64
|
+
}
|
|
65
|
+
} catch (err) {
|
|
66
|
+
const stderr = err.stderr ? err.stderr.toString() : '';
|
|
67
|
+
reject(new Error('Failed to extract ZIP archive on Windows: ' + err.message + '\nPowerShell Error: ' + stderr));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
fileStream.on('error', reject);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
res.pipe(tar.x({ C: tempDir }))
|
|
76
|
+
.on('finish', () => {
|
|
77
|
+
const binaryName = os.platform() === 'win32' ? 'agentsecrets.exe' : 'agentsecrets';
|
|
78
|
+
const src = path.join(tempDir, binaryName);
|
|
79
|
+
if (fs.existsSync(src)) {
|
|
80
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
81
|
+
fs.renameSync(src, dest);
|
|
82
|
+
fs.chmodSync(dest, 0o755);
|
|
83
|
+
|
|
84
|
+
// Pre-register with keychain-auth if available. This eliminates
|
|
85
|
+
// the one-time setup spinner on the user's first command.
|
|
86
|
+
try {
|
|
87
|
+
const { execFileSync } = require('child_process');
|
|
88
|
+
execFileSync('keychain-auth', ['register', dest], {
|
|
89
|
+
timeout: 5000,
|
|
90
|
+
stdio: 'ignore',
|
|
91
|
+
});
|
|
92
|
+
} catch (_) {
|
|
93
|
+
// Silent — AutoSetup handles registration at runtime if needed
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
resolve();
|
|
97
|
+
} else {
|
|
98
|
+
reject(new Error(`Binary ${binaryName} not found in archive`));
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
.on('error', reject);
|
|
102
|
+
}).on('error', reject);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function getLatestVersion() {
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
https.get({
|
|
109
|
+
hostname: 'api.github.com',
|
|
110
|
+
path: `/repos/${GITHUB_REPO}/releases/latest`,
|
|
111
|
+
headers: { 'User-Agent': 'agentsecrets-npm' }
|
|
112
|
+
}, (res) => {
|
|
113
|
+
let data = '';
|
|
114
|
+
res.on('data', (chunk) => data += chunk);
|
|
115
|
+
res.on('end', () => {
|
|
116
|
+
try {
|
|
117
|
+
const json = JSON.parse(data);
|
|
118
|
+
if (json.tag_name) {
|
|
119
|
+
resolve(json.tag_name.replace(/^v/, ''));
|
|
120
|
+
} else {
|
|
121
|
+
reject(new Error('No tag_name in latest release'));
|
|
122
|
+
}
|
|
123
|
+
} catch (e) {
|
|
124
|
+
reject(e);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}).on('error', reject);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function getBinaryPath() {
|
|
132
|
+
const { os_name, arch_name } = getPlatformInfo();
|
|
133
|
+
const binDir = path.join(os.homedir(), '.agentsecrets', 'bin');
|
|
134
|
+
const binaryName = os_name === 'windows' ? 'agentsecrets.exe' : 'agentsecrets';
|
|
135
|
+
|
|
136
|
+
// Try to get the latest version from GitHub
|
|
137
|
+
let version = VERSION;
|
|
138
|
+
try {
|
|
139
|
+
version = await getLatestVersion();
|
|
140
|
+
console.log(`Latest AgentSecrets version: ${version}`);
|
|
141
|
+
} catch (err) {
|
|
142
|
+
console.error(`Failed to fetch latest version from GitHub: ${err.message}. Falling back to package version ${VERSION}.`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const binaryPath = path.join(binDir, `${binaryName}_${version}`);
|
|
146
|
+
|
|
147
|
+
if (fs.existsSync(binaryPath)) {
|
|
148
|
+
return binaryPath;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
console.error(`AgentSecrets binary not found. Downloading v${version} for ${os_name}/${arch_name}...`);
|
|
152
|
+
|
|
153
|
+
const ext = os_name === 'windows' ? 'zip' : 'tar.gz';
|
|
154
|
+
const assetName = `agentsecrets_${version}_${os_name}_${arch_name}.${ext}`;
|
|
155
|
+
const url = `https://github.com/${GITHUB_REPO}/releases/download/v${version}/${assetName}`;
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
await downloadBinary(url, binaryPath);
|
|
159
|
+
return binaryPath;
|
|
160
|
+
} catch (err) {
|
|
161
|
+
throw new Error(`Failed to download AgentSecrets binary: ${err.message}\nURL: ${url}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function main() {
|
|
166
|
+
try {
|
|
167
|
+
const binaryPath = await getBinaryPath();
|
|
168
|
+
const args = process.argv.slice(2);
|
|
169
|
+
const proc = spawn(binaryPath, args, { stdio: 'inherit' });
|
|
170
|
+
proc.on('close', (code) => process.exit(code || 0));
|
|
171
|
+
proc.on('error', (err) => {
|
|
172
|
+
console.error(`Failed to execute AgentSecrets: ${err.message}`);
|
|
173
|
+
process.exit(1);
|
|
174
|
+
});
|
|
175
|
+
} catch (err) {
|
|
176
|
+
console.error(err.message);
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (require.main === module) {
|
|
182
|
+
main();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
module.exports = { getBinaryPath };
|
package/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @the-17/agentsecrets
|
|
3
|
+
* Zero-knowledge secrets infrastructure built for AI agents.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { spawn } = require('child_process');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { getBinaryPath } = require('./bin/agentsecrets');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Executes the agentsecrets CLI binary with the given arguments.
|
|
12
|
+
* @param {string[]} args
|
|
13
|
+
* @returns {Promise<number>}
|
|
14
|
+
*/
|
|
15
|
+
async function run(args = []) {
|
|
16
|
+
const binaryPath = await getBinaryPath();
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
const proc = spawn(binaryPath, args, { stdio: 'inherit' });
|
|
19
|
+
proc.on('close', (code) => resolve(code));
|
|
20
|
+
proc.on('error', (err) => reject(err));
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = {
|
|
25
|
+
run,
|
|
26
|
+
getBinaryPath
|
|
27
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@the-17/agentsecrets",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "AI-native zero-knowledge secrets manager (CLI wrapper)",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"cli",
|
|
19
19
|
"ai-secrets-management"
|
|
20
20
|
],
|
|
21
|
-
"author": "The Seventeen <
|
|
21
|
+
"author": "The Seventeen <engineering@theseventeen.co>",
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"repository": {
|
|
24
24
|
"type": "git",
|