hackmyagent 0.11.4 → 0.11.5
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 +27 -10
- package/dist/cli.js +203 -34
- package/dist/cli.js.map +1 -1
- package/dist/hardening/index.d.ts +1 -0
- package/dist/hardening/index.d.ts.map +1 -1
- package/dist/hardening/index.js +4 -1
- package/dist/hardening/index.js.map +1 -1
- package/dist/hardening/nemoclaw-scanner.d.ts +46 -0
- package/dist/hardening/nemoclaw-scanner.d.ts.map +1 -0
- package/dist/hardening/nemoclaw-scanner.js +1061 -0
- package/dist/hardening/nemoclaw-scanner.js.map +1 -0
- package/dist/hardening/scanner.d.ts +7 -0
- package/dist/hardening/scanner.d.ts.map +1 -1
- package/dist/hardening/scanner.js +598 -0
- package/dist/hardening/scanner.js.map +1 -1
- package/dist/hardening/taxonomy.d.ts.map +1 -1
- package/dist/hardening/taxonomy.js +40 -0
- package/dist/hardening/taxonomy.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/telemetry/contribute.d.ts +58 -49
- package/dist/telemetry/contribute.d.ts.map +1 -1
- package/dist/telemetry/contribute.js +187 -127
- package/dist/telemetry/contribute.js.map +1 -1
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +8 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/opt-in.d.ts +22 -13
- package/dist/telemetry/opt-in.d.ts.map +1 -1
- package/dist/telemetry/opt-in.js +93 -102
- package/dist/telemetry/opt-in.js.map +1 -1
- package/package.json +1 -1
package/dist/telemetry/opt-in.js
CHANGED
|
@@ -1,47 +1,59 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Contribution
|
|
3
|
+
* Contribution Consent and Scan Counting
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* with the OpenA2A Registry.
|
|
5
|
+
* Manages the user's consent to share anonymized scan findings
|
|
6
|
+
* with the OpenA2A Registry. Uses a delayed consent tip shown
|
|
7
|
+
* after the 3rd scan (non-interactive, no blocking prompts).
|
|
7
8
|
*
|
|
8
9
|
* Config/counting is delegated to @opena2a/shared (the canonical
|
|
9
10
|
* source for ~/.opena2a/config.json). If @opena2a/shared is not
|
|
10
11
|
* available at runtime, falls back to a local implementation.
|
|
11
12
|
*/
|
|
12
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports._resetBackend = _resetBackend;
|
|
13
15
|
exports.isContributeEnabled = isContributeEnabled;
|
|
14
16
|
exports.shouldPromptContribute = shouldPromptContribute;
|
|
15
17
|
exports.incrementScanCount = incrementScanCount;
|
|
16
18
|
exports.saveContributeChoice = saveContributeChoice;
|
|
19
|
+
exports.recordScanAndMaybeShowTip = recordScanAndMaybeShowTip;
|
|
17
20
|
exports.showContributePrompt = showContributePrompt;
|
|
18
21
|
const fs_1 = require("fs");
|
|
19
22
|
const path_1 = require("path");
|
|
20
23
|
/** Resolved backend -- lazy-initialized on first call. */
|
|
21
24
|
let _backend;
|
|
25
|
+
/** Reset cached backend (for testing). */
|
|
26
|
+
function _resetBackend() {
|
|
27
|
+
_backend = undefined;
|
|
28
|
+
}
|
|
22
29
|
function resolveBackend() {
|
|
23
30
|
if (_backend)
|
|
24
31
|
return _backend;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
typeof shared.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
// When OPENA2A_HOME is set, always use local backend so the custom
|
|
33
|
+
// home directory is respected (important for testing and isolation).
|
|
34
|
+
if (!process.env.OPENA2A_HOME) {
|
|
35
|
+
try {
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
37
|
+
const shared = require('@opena2a/shared');
|
|
38
|
+
if (typeof shared.isContributeEnabled === 'function' &&
|
|
39
|
+
typeof shared.setContributeEnabled === 'function' &&
|
|
40
|
+
typeof shared.incrementScanCount === 'function' &&
|
|
41
|
+
typeof shared.shouldPromptContribute === 'function' &&
|
|
42
|
+
typeof shared.dismissContributePrompt === 'function') {
|
|
43
|
+
_backend = {
|
|
44
|
+
isContributeEnabled: shared.isContributeEnabled,
|
|
45
|
+
setContributeEnabled: shared.setContributeEnabled,
|
|
46
|
+
incrementScanCount: shared.incrementScanCount,
|
|
47
|
+
getScanCount: shared.getScanCount || (() => 0),
|
|
48
|
+
shouldPromptContribute: shared.shouldPromptContribute,
|
|
49
|
+
dismissContributePrompt: shared.dismissContributePrompt,
|
|
50
|
+
};
|
|
51
|
+
return _backend;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// @opena2a/shared not installed -- fall through to local backend
|
|
41
56
|
}
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// @opena2a/shared not installed -- fall through to local backend
|
|
45
57
|
}
|
|
46
58
|
_backend = createLocalBackend();
|
|
47
59
|
return _backend;
|
|
@@ -68,6 +80,8 @@ function writeConfig(config) {
|
|
|
68
80
|
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
69
81
|
(0, fs_1.writeFileSync)(configPath, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
|
|
70
82
|
}
|
|
83
|
+
/** Cooldown for the consent tip: 30 days after dismissal. */
|
|
84
|
+
const TIP_COOLDOWN_MS = 30 * 24 * 60 * 60 * 1000;
|
|
71
85
|
function createLocalBackend() {
|
|
72
86
|
return {
|
|
73
87
|
isContributeEnabled() {
|
|
@@ -79,41 +93,49 @@ function createLocalBackend() {
|
|
|
79
93
|
if (!config.contribute)
|
|
80
94
|
config.contribute = {};
|
|
81
95
|
config.contribute.enabled = enabled;
|
|
82
|
-
const scanCount = config.contribute.scanCount ?? 0;
|
|
83
|
-
if (scanCount >= 9)
|
|
84
|
-
config.contribute.promptedAtTen = true;
|
|
85
96
|
writeConfig(config);
|
|
86
97
|
},
|
|
87
98
|
incrementScanCount() {
|
|
88
99
|
const config = readConfig();
|
|
89
|
-
if (!config.
|
|
90
|
-
config.
|
|
91
|
-
config.
|
|
100
|
+
if (!config.telemetry)
|
|
101
|
+
config.telemetry = {};
|
|
102
|
+
config.telemetry.scanCount = (config.telemetry.scanCount ?? 0) + 1;
|
|
92
103
|
writeConfig(config);
|
|
93
|
-
return config.
|
|
104
|
+
return config.telemetry.scanCount;
|
|
105
|
+
},
|
|
106
|
+
getScanCount() {
|
|
107
|
+
const config = readConfig();
|
|
108
|
+
return config.telemetry?.scanCount ?? 0;
|
|
94
109
|
},
|
|
95
110
|
shouldPromptContribute() {
|
|
96
111
|
const config = readConfig();
|
|
97
|
-
|
|
112
|
+
// Already decided -- do not prompt
|
|
113
|
+
if (config.contribute?.enabled === true || config.contribute?.enabled === false) {
|
|
98
114
|
return false;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
115
|
+
}
|
|
116
|
+
const count = config.telemetry?.scanCount ?? 0;
|
|
117
|
+
if (count < 3)
|
|
118
|
+
return false;
|
|
119
|
+
// Check cooldown
|
|
120
|
+
const dismissed = config.telemetry?.contributePromptDismissedAt;
|
|
121
|
+
if (dismissed) {
|
|
122
|
+
const dismissedMs = new Date(dismissed).getTime();
|
|
123
|
+
if (Date.now() - dismissedMs < TIP_COOLDOWN_MS)
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
105
127
|
},
|
|
106
128
|
dismissContributePrompt() {
|
|
107
129
|
const config = readConfig();
|
|
108
|
-
if (!config.
|
|
109
|
-
config.
|
|
110
|
-
config.
|
|
130
|
+
if (!config.telemetry)
|
|
131
|
+
config.telemetry = {};
|
|
132
|
+
config.telemetry.contributePromptDismissedAt = new Date().toISOString();
|
|
111
133
|
writeConfig(config);
|
|
112
134
|
},
|
|
113
135
|
};
|
|
114
136
|
}
|
|
115
137
|
// ---------------------------------------------------------------------------
|
|
116
|
-
// Public API
|
|
138
|
+
// Public API
|
|
117
139
|
// ---------------------------------------------------------------------------
|
|
118
140
|
/**
|
|
119
141
|
* Check whether the contribution setting is enabled.
|
|
@@ -121,23 +143,18 @@ function createLocalBackend() {
|
|
|
121
143
|
* Returns:
|
|
122
144
|
* true - user explicitly opted in
|
|
123
145
|
* false - user explicitly opted out (or default in shared backend)
|
|
124
|
-
* undefined - not yet configured
|
|
125
|
-
* defaults to false, so callers should rely on
|
|
126
|
-
* shouldPromptContribute() for prompt logic)
|
|
146
|
+
* undefined - not yet configured
|
|
127
147
|
*/
|
|
128
148
|
function isContributeEnabled() {
|
|
129
149
|
return resolveBackend().isContributeEnabled() || undefined;
|
|
130
150
|
}
|
|
131
151
|
/**
|
|
132
|
-
* Check whether we should show the contribution
|
|
152
|
+
* Check whether we should show the contribution tip.
|
|
133
153
|
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* and cooldown/dismiss logic.
|
|
154
|
+
* Returns true after the 3rd scan if the user hasn't opted in,
|
|
155
|
+
* opted out, or dismissed the tip within the last 30 days.
|
|
137
156
|
*/
|
|
138
157
|
function shouldPromptContribute() {
|
|
139
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
140
|
-
return false;
|
|
141
158
|
return resolveBackend().shouldPromptContribute();
|
|
142
159
|
}
|
|
143
160
|
/**
|
|
@@ -145,7 +162,7 @@ function shouldPromptContribute() {
|
|
|
145
162
|
* regardless of contribution setting.
|
|
146
163
|
*/
|
|
147
164
|
function incrementScanCount() {
|
|
148
|
-
resolveBackend().incrementScanCount();
|
|
165
|
+
return resolveBackend().incrementScanCount();
|
|
149
166
|
}
|
|
150
167
|
/**
|
|
151
168
|
* Save the user's contribution choice to the config file.
|
|
@@ -157,64 +174,38 @@ function saveContributeChoice(enabled) {
|
|
|
157
174
|
}
|
|
158
175
|
}
|
|
159
176
|
/**
|
|
160
|
-
*
|
|
177
|
+
* Record a scan and return a consent tip string if the threshold is reached.
|
|
161
178
|
*
|
|
162
|
-
*
|
|
163
|
-
* Returns
|
|
179
|
+
* After the 3rd scan, returns a non-interactive tip encouraging the user
|
|
180
|
+
* to enable contribution. Returns null if tip should not be shown.
|
|
181
|
+
* This replaces the previous interactive Y/N prompt.
|
|
164
182
|
*/
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
183
|
+
function recordScanAndMaybeShowTip() {
|
|
184
|
+
incrementScanCount();
|
|
185
|
+
if (!shouldPromptContribute())
|
|
186
|
+
return null;
|
|
187
|
+
// Mark as shown so we respect the 30-day cooldown
|
|
188
|
+
resolveBackend().dismissContributePrompt();
|
|
189
|
+
return [
|
|
169
190
|
'',
|
|
170
|
-
'
|
|
171
|
-
'
|
|
172
|
-
'
|
|
191
|
+
' Tip: Your scans help build community trust data for MCP servers and AI agents.',
|
|
192
|
+
' Share anonymized results so other developers can make informed security decisions.',
|
|
193
|
+
' Enable: npx hackmyagent scan --contribute (or: opena2a config contribute on)',
|
|
173
194
|
'',
|
|
174
|
-
|
|
175
|
-
];
|
|
176
|
-
for (const line of lines) {
|
|
177
|
-
process.stdout.write(line + '\n');
|
|
178
|
-
}
|
|
179
|
-
const answer = await readSingleKey();
|
|
180
|
-
const enabled = answer.toLowerCase() === 'y';
|
|
181
|
-
saveContributeChoice(enabled);
|
|
182
|
-
if (enabled) {
|
|
183
|
-
process.stdout.write('\nContribution enabled. Thank you.\n');
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
process.stdout.write('\nContribution disabled. You can enable it later: opena2a config set contribute true\n');
|
|
187
|
-
}
|
|
188
|
-
return enabled;
|
|
195
|
+
].join('\n');
|
|
189
196
|
}
|
|
190
197
|
/**
|
|
191
|
-
*
|
|
192
|
-
*
|
|
198
|
+
* Display the contribution opt-in prompt and return the user's choice.
|
|
199
|
+
*
|
|
200
|
+
* @deprecated Use recordScanAndMaybeShowTip() instead. This is kept
|
|
201
|
+
* for backward compatibility but now shows a non-interactive tip
|
|
202
|
+
* rather than blocking for input.
|
|
193
203
|
*/
|
|
194
|
-
function
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
resolve('n');
|
|
201
|
-
}, 30000);
|
|
202
|
-
function cleanup() {
|
|
203
|
-
clearTimeout(timer);
|
|
204
|
-
stdin.removeListener('data', onData);
|
|
205
|
-
if (stdin.isRaw !== wasRaw) {
|
|
206
|
-
stdin.setRawMode(wasRaw ?? false);
|
|
207
|
-
}
|
|
208
|
-
stdin.pause();
|
|
209
|
-
}
|
|
210
|
-
function onData(data) {
|
|
211
|
-
const char = data.toString().trim().toLowerCase();
|
|
212
|
-
cleanup();
|
|
213
|
-
resolve(char || 'n');
|
|
214
|
-
}
|
|
215
|
-
stdin.setRawMode(true);
|
|
216
|
-
stdin.resume();
|
|
217
|
-
stdin.once('data', onData);
|
|
218
|
-
});
|
|
204
|
+
async function showContributePrompt() {
|
|
205
|
+
const tip = recordScanAndMaybeShowTip();
|
|
206
|
+
if (tip) {
|
|
207
|
+
process.stdout.write(tip + '\n');
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
219
210
|
}
|
|
220
211
|
//# sourceMappingURL=opt-in.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opt-in.js","sourceRoot":"","sources":["../../src/telemetry/opt-in.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"opt-in.js","sourceRoot":"","sources":["../../src/telemetry/opt-in.ts"],"names":[],"mappings":"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"}
|