ai-trust 0.2.1 → 0.2.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.
@@ -1,26 +1,54 @@
1
1
  /**
2
- * Contribution Opt-In Prompt
2
+ * Contribution Consent and Scan Counting
3
3
  *
4
- * Handles the user's consent to share anonymized scan findings
5
- * with the OpenA2A Registry. Prompts on first scan and once at
6
- * scan #10, then never again.
4
+ * Manages the user's consent to share anonymized scan findings
5
+ * with the OpenA2A Registry. Uses a delayed consent tip shown
6
+ * after the 3rd scan (non-interactive, no blocking prompts).
7
7
  *
8
- * Shares ~/.opena2a/config.json with the rest of the OpenA2A ecosystem
9
- * (opena2a-cli, hackmyagent) so opt-in carries across tools.
8
+ * Config/counting is delegated to @opena2a/shared (the canonical
9
+ * source for ~/.opena2a/config.json). If @opena2a/shared is not
10
+ * available at runtime, falls back to a local implementation.
10
11
  */
11
12
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
12
- import { homedir } from "os";
13
- import { dirname, join } from "path";
14
- /**
15
- * Resolve the path to the OpenA2A config file.
16
- */
13
+ import { join } from "path";
14
+ /** Resolved backend -- lazy-initialized on first call. */
15
+ let _backend;
16
+ function resolveBackend() {
17
+ if (_backend)
18
+ return _backend;
19
+ // When OPENA2A_HOME is set, always use local backend so the custom
20
+ // home directory is respected (important for testing and isolation).
21
+ if (!process.env.OPENA2A_HOME) {
22
+ try {
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ const shared = require("@opena2a/shared");
25
+ if (typeof shared.isContributeEnabled === "function" &&
26
+ typeof shared.setContributeEnabled === "function" &&
27
+ typeof shared.incrementScanCount === "function" &&
28
+ typeof shared.shouldPromptContribute === "function" &&
29
+ typeof shared.dismissContributePrompt === "function") {
30
+ _backend = {
31
+ isContributeEnabled: shared.isContributeEnabled,
32
+ setContributeEnabled: shared.setContributeEnabled,
33
+ incrementScanCount: shared.incrementScanCount,
34
+ getScanCount: shared.getScanCount || (() => 0),
35
+ shouldPromptContribute: shared.shouldPromptContribute,
36
+ dismissContributePrompt: shared.dismissContributePrompt,
37
+ };
38
+ return _backend;
39
+ }
40
+ }
41
+ catch {
42
+ // @opena2a/shared not installed -- fall through to local backend
43
+ }
44
+ }
45
+ _backend = createLocalBackend();
46
+ return _backend;
47
+ }
17
48
  function getConfigPath() {
18
- const home = process.env.OPENA2A_HOME || join(homedir(), ".opena2a");
49
+ const home = process.env.OPENA2A_HOME || join(require("os").homedir(), ".opena2a");
19
50
  return join(home, "config.json");
20
51
  }
21
- /**
22
- * Read the OpenA2A config file. Returns empty object if missing or invalid.
23
- */
24
52
  function readConfig() {
25
53
  const configPath = getConfigPath();
26
54
  try {
@@ -29,156 +57,157 @@ function readConfig() {
29
57
  }
30
58
  }
31
59
  catch {
32
- // Corrupt config file -- treat as empty
60
+ // Corrupt config -- treat as empty
33
61
  }
34
62
  return {};
35
63
  }
36
- /**
37
- * Write the OpenA2A config file, preserving existing fields.
38
- */
39
64
  function writeConfig(config) {
40
65
  const configPath = getConfigPath();
41
- const dir = dirname(configPath);
66
+ const dir = require("path").dirname(configPath);
42
67
  mkdirSync(dir, { recursive: true });
43
68
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", {
44
69
  mode: 0o600,
45
70
  });
46
71
  }
72
+ /** Cooldown for the consent tip: 30 days after dismissal. */
73
+ const TIP_COOLDOWN_MS = 30 * 24 * 60 * 60 * 1000;
74
+ function createLocalBackend() {
75
+ return {
76
+ isContributeEnabled() {
77
+ const config = readConfig();
78
+ return config.contribute?.enabled === true;
79
+ },
80
+ setContributeEnabled(enabled) {
81
+ const config = readConfig();
82
+ if (!config.contribute)
83
+ config.contribute = {};
84
+ config.contribute.enabled = enabled;
85
+ writeConfig(config);
86
+ },
87
+ incrementScanCount() {
88
+ const config = readConfig();
89
+ if (!config.telemetry)
90
+ config.telemetry = {};
91
+ config.telemetry.scanCount = (config.telemetry.scanCount ?? 0) + 1;
92
+ writeConfig(config);
93
+ return config.telemetry.scanCount;
94
+ },
95
+ getScanCount() {
96
+ const config = readConfig();
97
+ return config.telemetry?.scanCount ?? 0;
98
+ },
99
+ shouldPromptContribute() {
100
+ const config = readConfig();
101
+ // Already decided -- do not prompt
102
+ if (config.contribute?.enabled === true ||
103
+ config.contribute?.enabled === false) {
104
+ return false;
105
+ }
106
+ const count = config.telemetry?.scanCount ?? 0;
107
+ if (count < 3)
108
+ return false;
109
+ // Check cooldown
110
+ const dismissed = config.telemetry?.contributePromptDismissedAt;
111
+ if (dismissed) {
112
+ const dismissedMs = new Date(dismissed).getTime();
113
+ if (Date.now() - dismissedMs < TIP_COOLDOWN_MS)
114
+ return false;
115
+ }
116
+ return true;
117
+ },
118
+ dismissContributePrompt() {
119
+ const config = readConfig();
120
+ if (!config.telemetry)
121
+ config.telemetry = {};
122
+ config.telemetry.contributePromptDismissedAt = new Date().toISOString();
123
+ writeConfig(config);
124
+ },
125
+ };
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Public API
129
+ // ---------------------------------------------------------------------------
47
130
  /**
48
131
  * Check whether the contribution setting is enabled.
49
132
  *
50
133
  * Returns:
51
- * true - user explicitly opted in, or --contribute flag used
52
- * false - user explicitly opted out, or --no-contribute flag used
53
- * undefined - not yet configured (should prompt)
134
+ * true - user explicitly opted in
135
+ * false - user explicitly opted out (or default in shared backend)
136
+ * undefined - not yet configured
54
137
  */
55
138
  export function isContributeEnabled() {
56
- const config = readConfig();
57
- if (config.contribute?.enabled === true)
58
- return true;
59
- if (config.contribute?.enabled === false)
60
- return false;
61
- return undefined;
139
+ return resolveBackend().isContributeEnabled() || undefined;
62
140
  }
63
141
  /**
64
- * Check whether we should show the contribution prompt.
142
+ * Check whether we should show the contribution tip.
65
143
  *
66
- * Prompt conditions:
67
- * 1. contribute.enabled is undefined (never asked) and this is the first scan
68
- * 2. contribute.enabled is undefined and scan count has reached 10 (second chance)
69
- *
70
- * Returns false if:
71
- * - contribute.enabled is explicitly set (true or false)
72
- * - Non-interactive environment (no TTY)
73
- * - Already prompted at scan #10
144
+ * Returns true after the 3rd scan if the user hasn't opted in,
145
+ * opted out, or dismissed the tip within the last 30 days.
74
146
  */
75
147
  export function shouldPromptContribute() {
76
- // Never prompt in non-interactive environments
77
- if (!process.stdin.isTTY || !process.stdout.isTTY)
78
- return false;
79
- const config = readConfig();
80
- // Already configured -- never prompt
81
- if (config.contribute?.enabled === true ||
82
- config.contribute?.enabled === false) {
83
- return false;
84
- }
85
- const scanCount = config.contribute?.scanCount ?? 0;
86
- // First scan (scanCount === 0): prompt
87
- if (scanCount === 0)
88
- return true;
89
- // Tenth scan: prompt once more (second chance)
90
- if (scanCount >= 9 && !config.contribute?.promptedAtTen)
91
- return true;
92
- return false;
148
+ return resolveBackend().shouldPromptContribute();
93
149
  }
94
150
  /**
95
- * Increment the scan count in the config file.
96
- * Called after each scan completes, regardless of contribution setting.
151
+ * Increment the scan count. Called after each scan completes,
152
+ * regardless of contribution setting.
97
153
  */
98
154
  export function incrementScanCount() {
99
- const config = readConfig();
100
- if (!config.contribute) {
101
- config.contribute = {};
102
- }
103
- config.contribute.scanCount = (config.contribute.scanCount ?? 0) + 1;
104
- writeConfig(config);
155
+ return resolveBackend().incrementScanCount();
105
156
  }
106
157
  /**
107
158
  * Save the user's contribution choice to the config file.
108
159
  */
109
160
  export function saveContributeChoice(enabled) {
110
- const config = readConfig();
111
- if (!config.contribute) {
112
- config.contribute = {};
161
+ resolveBackend().setContributeEnabled(enabled);
162
+ if (!enabled) {
163
+ resolveBackend().dismissContributePrompt();
113
164
  }
114
- config.contribute.enabled = enabled;
115
- // Track that we prompted at scan #10 so we don't ask again
116
- const scanCount = config.contribute.scanCount ?? 0;
117
- if (scanCount >= 9) {
118
- config.contribute.promptedAtTen = true;
119
- }
120
- writeConfig(config);
121
165
  }
122
166
  /**
123
- * Display the contribution opt-in prompt and return the user's choice.
167
+ * Record a scan and return a consent tip string if the threshold is reached.
124
168
  *
125
- * Uses raw stdin to read a single keypress (Y/N).
126
- * Returns true if the user opted in, false otherwise.
169
+ * After the 3rd scan, returns a non-interactive tip encouraging the user
170
+ * to enable contribution. Returns null if tip should not be shown.
171
+ * This replaces the previous interactive Y/N prompt.
127
172
  */
128
- export async function showContributePrompt() {
129
- const lines = [
173
+ export function recordScanAndMaybeShowTip() {
174
+ incrementScanCount();
175
+ if (!shouldPromptContribute())
176
+ return null;
177
+ // Mark as shown so we respect the 30-day cooldown
178
+ resolveBackend().dismissContributePrompt();
179
+ return [
130
180
  "",
131
- "Help improve security for the AI agent community.",
181
+ " Tip: Your scans help build community trust data for MCP servers and AI agents.",
182
+ " Share anonymized results so other developers can make informed security decisions.",
183
+ " Enable: npx ai-trust check --contribute (or: opena2a config contribute on)",
132
184
  "",
133
- "Share anonymized scan findings with the OpenA2A Registry?",
134
- "No personal data. No source code. Only check pass/fail results.",
135
- "You can opt out anytime: opena2a config set contribute false",
136
- "",
137
- "[Y] Yes, contribute [N] No thanks",
138
- ];
139
- for (const line of lines) {
140
- process.stderr.write(line + "\n");
141
- }
142
- const answer = await readSingleKey();
143
- const enabled = answer.toLowerCase() === "y";
144
- saveContributeChoice(enabled);
145
- if (enabled) {
146
- process.stderr.write("\nContribution enabled. Thank you.\n");
147
- }
148
- else {
149
- process.stderr.write("\nContribution disabled. You can enable it later: opena2a config set contribute true\n");
185
+ ].join("\n");
186
+ }
187
+ /**
188
+ * Display the contribution opt-in prompt and return the user's choice.
189
+ *
190
+ * @deprecated Use recordScanAndMaybeShowTip() instead. This is kept
191
+ * for backward compatibility but now shows a non-interactive tip
192
+ * rather than blocking for input.
193
+ */
194
+ export async function showContributePrompt() {
195
+ const tip = recordScanAndMaybeShowTip();
196
+ if (tip) {
197
+ process.stdout.write(tip + "\n");
150
198
  }
151
- return enabled;
199
+ return false;
152
200
  }
153
201
  /**
154
- * Read a single keypress from stdin.
155
- * Falls back to 'n' after a 30-second timeout.
202
+ * Reset the backend (for testing).
203
+ * When forceLocal is true, skips @opena2a/shared resolution and uses the
204
+ * local file-based backend. This allows tests to control config via
205
+ * OPENA2A_HOME without the shared backend ignoring that env var.
156
206
  */
157
- function readSingleKey() {
158
- return new Promise((resolve) => {
159
- const stdin = process.stdin;
160
- const wasRaw = stdin.isRaw;
161
- // Timeout after 30 seconds -- default to 'n'
162
- const timer = setTimeout(() => {
163
- cleanup();
164
- resolve("n");
165
- }, 30_000);
166
- function cleanup() {
167
- clearTimeout(timer);
168
- stdin.removeListener("data", onData);
169
- if (stdin.isRaw !== wasRaw) {
170
- stdin.setRawMode(wasRaw ?? false);
171
- }
172
- stdin.pause();
173
- }
174
- function onData(data) {
175
- const char = data.toString().trim().toLowerCase();
176
- cleanup();
177
- resolve(char || "n");
178
- }
179
- stdin.setRawMode(true);
180
- stdin.resume();
181
- stdin.once("data", onData);
182
- });
207
+ export function _resetBackend(forceLocal = false) {
208
+ _backend = undefined;
209
+ if (forceLocal) {
210
+ _backend = createLocalBackend();
211
+ }
183
212
  }
184
213
  //# sourceMappingURL=opt-in.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opt-in.js","sourceRoot":"","sources":["../../src/telemetry/opt-in.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opt-in.js","sourceRoot":"","sources":["../../src/telemetry/opt-in.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "name": "ai-trust",
3
- "version": "0.2.1",
3
+ "version": "0.2.4",
4
4
  "description": "Trust verification CLI for AI packages — check MCP servers, A2A agents, and AI tools before you install",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/opena2a-org/ai-trust.git"
8
+ },
5
9
  "type": "module",
6
10
  "main": "dist/index.js",
7
11
  "bin": {
@@ -33,6 +37,7 @@
33
37
  "author": "OpenA2A",
34
38
  "license": "Apache-2.0",
35
39
  "dependencies": {
40
+ "@opena2a/shared": "^0.1.0",
36
41
  "chalk": "^5.3.0",
37
42
  "commander": "^12.1.0"
38
43
  },