@the-17/agentsecrets 1.1.2 → 1.1.4

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.
Files changed (2) hide show
  1. package/bin/agentsecrets.js +69 -26
  2. package/package.json +4 -3
@@ -5,10 +5,8 @@ const fs = require('fs');
5
5
  const path = require('path');
6
6
  const { spawn } = require('child_process');
7
7
  const https = require('https');
8
- const zlib = require('zlib');
9
8
  const tar = require('tar');
10
9
 
11
- const VERSION = "1.0.4";
12
10
  const GITHUB_REPO = "The-17/agentsecrets";
13
11
 
14
12
  function getPlatformInfo() {
@@ -28,10 +26,49 @@ function getPlatformInfo() {
28
26
  return { osName, archName };
29
27
  }
30
28
 
29
+ function httpsGet(url) {
30
+ return new Promise((resolve, reject) => {
31
+ https.get(url, { headers: { 'User-Agent': 'agentsecrets-npm' } }, (res) => {
32
+ if (res.statusCode === 301 || res.statusCode === 302) {
33
+ return httpsGet(res.headers.location).then(resolve).catch(reject);
34
+ }
35
+ let data = '';
36
+ res.on('data', chunk => data += chunk);
37
+ res.on('end', () => resolve({ statusCode: res.statusCode, body: data }));
38
+ }).on('error', reject);
39
+ });
40
+ }
41
+
42
+ const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
43
+
44
+ async function getLatestVersion(baseDir) {
45
+ const cacheFile = path.join(baseDir, 'version.cache');
46
+
47
+ // Check cache first
48
+ if (fs.existsSync(cacheFile)) {
49
+ const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
50
+ if (Date.now() - cache.timestamp < CACHE_TTL_MS) {
51
+ return cache.version;
52
+ }
53
+ }
54
+
55
+ try {
56
+ const { body } = await httpsGet(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`);
57
+ const release = JSON.parse(body);
58
+ const version = release.tag_name.replace(/^v/, '');
59
+
60
+ // Save to cache
61
+ fs.writeFileSync(cacheFile, JSON.stringify({ version, timestamp: Date.now() }));
62
+ return version;
63
+ } catch {
64
+ return null;
65
+ }
66
+ }
67
+
31
68
  async function downloadFile(url, dest) {
32
69
  return new Promise((resolve, reject) => {
33
70
  const file = fs.createWriteStream(dest);
34
- https.get(url, (response) => {
71
+ https.get(url, { headers: { 'User-Agent': 'agentsecrets-npm' } }, (response) => {
35
72
  if (response.statusCode === 302 || response.statusCode === 301) {
36
73
  downloadFile(response.headers.location, dest).then(resolve).catch(reject);
37
74
  return;
@@ -41,9 +78,7 @@ async function downloadFile(url, dest) {
41
78
  return;
42
79
  }
43
80
  response.pipe(file);
44
- file.on('finish', () => {
45
- file.close(resolve);
46
- });
81
+ file.on('finish', () => file.close(resolve));
47
82
  }).on('error', (err) => {
48
83
  fs.unlink(dest, () => reject(err));
49
84
  });
@@ -60,17 +95,36 @@ async function ensureBinary() {
60
95
  let binaryName = 'agentsecrets';
61
96
  if (osName === 'windows') binaryName += '.exe';
62
97
 
63
- const binaryPath = path.join(baseDir, `${binaryName}_${VERSION}`);
98
+ // Check GitHub for the latest version
99
+ const latestVersion = await getLatestVersion(baseDir);
100
+
101
+ if (!latestVersion) {
102
+ // Offline or GitHub unreachable — fall back to any existing binary
103
+ const existing = fs.readdirSync(baseDir).find(f => f.startsWith(binaryName));
104
+ if (existing) {
105
+ process.stderr.write('Could not reach GitHub. Using cached binary.\n');
106
+ return path.join(baseDir, existing);
107
+ }
108
+ throw new Error('No cached binary and could not reach GitHub to download one.');
109
+ }
110
+
111
+ const binaryPath = path.join(baseDir, `${binaryName}_${latestVersion}`);
64
112
 
65
113
  if (fs.existsSync(binaryPath)) {
66
- return binaryPath;
114
+ return binaryPath; // Already on latest
115
+ }
116
+
117
+ // Delete old binaries
118
+ const oldBinaries = fs.readdirSync(baseDir).filter(f => f.startsWith(binaryName));
119
+ for (const old of oldBinaries) {
120
+ fs.unlinkSync(path.join(baseDir, old));
67
121
  }
68
122
 
69
- process.stderr.write(`AgentSecrets binary not found. Downloading version ${VERSION} for ${osName}/${archName}...\n`);
123
+ process.stderr.write(`Downloading AgentSecrets v${latestVersion} for ${osName}/${archName}...\n`);
70
124
 
71
125
  const ext = osName === 'windows' ? 'zip' : 'tar.gz';
72
- const assetName = `agentsecrets_${VERSION}_${osName}_${archName}.${ext}`;
73
- const url = `https://github.com/${GITHUB_REPO}/releases/download/v${VERSION}/${assetName}`;
126
+ const assetName = `agentsecrets_${latestVersion}_${osName}_${archName}.${ext}`;
127
+ const url = `https://github.com/${GITHUB_REPO}/releases/download/v${latestVersion}/${assetName}`;
74
128
 
75
129
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsecrets-'));
76
130
  const archivePath = path.join(tmpDir, assetName);
@@ -79,25 +133,16 @@ async function ensureBinary() {
79
133
  await downloadFile(url, archivePath);
80
134
 
81
135
  if (ext === 'tar.gz') {
82
- await tar.x({
83
- file: archivePath,
84
- cwd: tmpDir
85
- });
136
+ await tar.x({ file: archivePath, cwd: tmpDir });
86
137
  } else {
87
- // For zip, we'd need a library like adm-zip or similar,
88
- // but to keep it zero-dep, we can assume Linux/Mac for npx mostly,
89
- // or use powershell/unzip if available.
90
- // For now, let's focus on tar.gz and provide a hint for windows.
91
138
  if (osName === 'windows') {
92
- throw new Error("Automatic zip extraction for Windows not yet implemented in zero-dep script. Please install via Go or pip.");
139
+ throw new Error('Automatic zip extraction for Windows not yet implemented.');
93
140
  }
94
141
  }
95
142
 
96
143
  const extractedBinary = path.join(tmpDir, binaryName);
97
144
  fs.copyFileSync(extractedBinary, binaryPath);
98
145
  fs.chmodSync(binaryPath, 0o755);
99
-
100
- // Cleanup
101
146
  fs.rmSync(tmpDir, { recursive: true, force: true });
102
147
 
103
148
  return binaryPath;
@@ -111,13 +156,11 @@ async function main() {
111
156
  const binaryPath = await ensureBinary();
112
157
  const args = process.argv.slice(2);
113
158
  const child = spawn(binaryPath, args, { stdio: 'inherit' });
114
- child.on('exit', (code) => {
115
- process.exit(code);
116
- });
159
+ child.on('exit', (code) => process.exit(code));
117
160
  } catch (err) {
118
161
  process.stderr.write(`Error: ${err.message}\n`);
119
162
  process.exit(1);
120
163
  }
121
164
  }
122
165
 
123
- main();
166
+ main();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@the-17/agentsecrets",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "AI-native zero-knowledge secrets manager (CLI wrapper)",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -15,7 +15,8 @@
15
15
  "secrets",
16
16
  "security",
17
17
  "credentials",
18
- "cli"
18
+ "cli",
19
+ "ai-secrets-management"
19
20
  ],
20
21
  "author": "The Seventeen <hello@theseventeen.co>",
21
22
  "license": "MIT",
@@ -33,4 +34,4 @@
33
34
  "dependencies": {
34
35
  "tar": "^6.2.1"
35
36
  }
36
- }
37
+ }