@shield-agent/kya 0.21.0 → 0.22.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.
Files changed (41) hide show
  1. package/.mcp.json +1 -1
  2. package/LIMITATIONS.md +1 -0
  3. package/README.md +23 -6
  4. package/amp/settings.example.json +1 -1
  5. package/claude/claude_desktop_config.example.json +1 -1
  6. package/cline/cline_mcp_settings.example.json +1 -1
  7. package/copilot/mcp-config.example.json +1 -1
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +63 -23
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/gate-serve.d.ts.map +1 -1
  13. package/dist/commands/gate-serve.js +16 -2
  14. package/dist/commands/gate-serve.js.map +1 -1
  15. package/dist/commands/receipt.d.ts +5 -2
  16. package/dist/commands/receipt.d.ts.map +1 -1
  17. package/dist/commands/receipt.js +7 -4
  18. package/dist/commands/receipt.js.map +1 -1
  19. package/dist/receipt/share.d.ts +19 -0
  20. package/dist/receipt/share.d.ts.map +1 -1
  21. package/dist/receipt/share.js +65 -2
  22. package/dist/receipt/share.js.map +1 -1
  23. package/dist/telemetry.d.ts +135 -0
  24. package/dist/telemetry.d.ts.map +1 -0
  25. package/dist/telemetry.js +427 -0
  26. package/dist/telemetry.js.map +1 -0
  27. package/droid/README.md +1 -1
  28. package/droid/mcp.example.json +1 -1
  29. package/gemini/settings.example.json +1 -1
  30. package/grok/README.md +1 -1
  31. package/kilo/kilo.example.json +1 -1
  32. package/kimi/mcp.example.json +1 -1
  33. package/kiro/mcp.example.json +1 -1
  34. package/manifest.json +1 -1
  35. package/mastracode/mcp.example.json +1 -1
  36. package/mcp.json +1 -1
  37. package/openai/codex.config.example.toml +1 -1
  38. package/opencode/opencode.example.json +1 -1
  39. package/package.json +3 -2
  40. package/qwen/settings.example.json +1 -1
  41. package/server.json +2 -2
@@ -0,0 +1,427 @@
1
+ /**
2
+ * Opt-in anonymous usage telemetry (`kya telemetry`). Off until the user says yes.
3
+ *
4
+ * What it is: a start / heartbeat / end beacon from the LONG-LIVED KYA processes (MCP gate over
5
+ * stdio or http, the report daemon, the gateway supervisor) so the maintainers can see how many
6
+ * installs are live, which versions and platforms run, and how long sessions last.
7
+ *
8
+ * `kya hook` is spawn-per-tool-call and stays network-free: when the user opted in, it spawns a
9
+ * detached helper (`kya telemetry ping`) at most once a day and returns immediately, so installs that
10
+ * only use hooks still show up as active. The hook itself never waits on the network. The beacon is
11
+ * not imported by the SDK surface (`src/sdk`), which promises no telemetry or network clients.
12
+ *
13
+ * Hard rules (see docs/telemetry.md):
14
+ * - consent is an explicit `y`/`yes` (default NO), asked once, interactive terminals only, on
15
+ * stderr, never in `--json` mode and never from an MCP stdio process (stdout is its protocol);
16
+ * - nothing is sent in CI or when DO_NOT_TRACK / KYA_TELEMETRY=0 is set;
17
+ * - the payload is a fixed allow-list (see {@link buildPayload}); no paths, names, args, prompts;
18
+ * - a failed send never affects the CLI: short timeout, errors swallowed on purpose, three
19
+ * consecutive failures stop the beacon for the rest of the process.
20
+ *
21
+ * `KYA_OFFLINE` deliberately does NOT block telemetry: it is documented as "sample evaluate", and
22
+ * `kya connect` writes KYA_OFFLINE=1 into every MCP host config, so honouring it would silence every
23
+ * session a connected host launches even for someone who answered yes.
24
+ */
25
+ import { randomUUID } from "node:crypto";
26
+ import { spawn } from "node:child_process";
27
+ import { mkdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "node:fs";
28
+ import { createInterface } from "node:readline";
29
+ import { join } from "node:path";
30
+ import { globalConfigDir, resolveGateMode } from "./config.js";
31
+ import { atomicWriteSync } from "./fs-atomic.js";
32
+ import { CLI_VERSION } from "./version.js";
33
+ export const DEFAULT_TELEMETRY_ENDPOINT = "https://shield-agent.com/api/v1/telemetry/kya";
34
+ const SEND_TIMEOUT_MS = 3_000;
35
+ const DEFAULT_HEARTBEAT_MS = 5 * 60_000;
36
+ const MAX_CONSECUTIVE_FAILURES = 3;
37
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
38
+ const OFF_RE = /^(0|false|no|off)$/i;
39
+ const truthy = (value) => value !== undefined && value.trim() !== "" && !OFF_RE.test(value.trim());
40
+ // ---------------------------------------------------------------------------------------------
41
+ // State (~/.kya/telemetry.json)
42
+ // ---------------------------------------------------------------------------------------------
43
+ export function telemetryStatePath(env) {
44
+ return join(globalConfigDir(env), "telemetry.json");
45
+ }
46
+ /** Tolerant read: a missing, corrupt or hand-edited file is "never asked", never an error. */
47
+ export function readTelemetryState(env) {
48
+ try {
49
+ const raw = JSON.parse(readFileSync(telemetryStatePath(env), "utf8"));
50
+ return {
51
+ ...(typeof raw["enabled"] === "boolean" ? { enabled: raw["enabled"] } : {}),
52
+ ...(typeof raw["installId"] === "string" && UUID_RE.test(raw["installId"])
53
+ ? { installId: raw["installId"].toLowerCase() }
54
+ : {}),
55
+ ...(typeof raw["askedAt"] === "string" ? { askedAt: raw["askedAt"] } : {}),
56
+ };
57
+ }
58
+ catch {
59
+ return {};
60
+ }
61
+ }
62
+ export function writeTelemetryState(env, state) {
63
+ mkdirSync(globalConfigDir(env), { recursive: true, mode: 0o700 });
64
+ atomicWriteSync(telemetryStatePath(env), `${JSON.stringify(state, null, 2)}\n`);
65
+ }
66
+ // ---------------------------------------------------------------------------------------------
67
+ // Gates
68
+ // ---------------------------------------------------------------------------------------------
69
+ /** Why telemetry is forced off for THIS process regardless of the saved answer, or undefined. */
70
+ export function telemetryDisabledReason(env) {
71
+ if (truthy(env["DO_NOT_TRACK"]))
72
+ return "DO_NOT_TRACK is set";
73
+ if (env["KYA_TELEMETRY"] !== undefined && OFF_RE.test(env["KYA_TELEMETRY"].trim())) {
74
+ return "KYA_TELEMETRY is off";
75
+ }
76
+ if (truthy(env["CI"]) || env["GITHUB_ACTIONS"] === "true")
77
+ return "running in CI";
78
+ return undefined;
79
+ }
80
+ /** True only when the user opted in AND nothing overrides it for this process. */
81
+ export function isTelemetryEnabled(env) {
82
+ if (telemetryDisabledReason(env) !== undefined)
83
+ return false;
84
+ const state = readTelemetryState(env);
85
+ return state.enabled === true && state.installId !== undefined;
86
+ }
87
+ /** https, or http on a loopback host (tests, self-hosting). Anything else falls back to the default. */
88
+ export function telemetryEndpoint(env) {
89
+ const raw = env["KYA_TELEMETRY_URL"]?.trim();
90
+ if (raw) {
91
+ try {
92
+ const url = new URL(raw);
93
+ const loopback = ["127.0.0.1", "localhost", "[::1]"].includes(url.hostname);
94
+ const credentials = url.username !== "" || url.password !== "";
95
+ if (!credentials && (url.protocol === "https:" || (url.protocol === "http:" && loopback))) {
96
+ return url.toString();
97
+ }
98
+ }
99
+ catch {
100
+ /* unparsable override: use the default */
101
+ }
102
+ }
103
+ return DEFAULT_TELEMETRY_ENDPOINT;
104
+ }
105
+ function eraseEndpoint(env) {
106
+ return `${telemetryEndpoint(env).replace(/\/+$/, "")}/erase`;
107
+ }
108
+ // ---------------------------------------------------------------------------------------------
109
+ // Payload
110
+ // ---------------------------------------------------------------------------------------------
111
+ /** Host registry slug from the session id `kya connect` writes (`mcp:<host>`), else "unknown". */
112
+ export function telemetryHostId(env) {
113
+ const match = /^mcp:([a-z][a-z0-9-]{0,31})$/.exec(env["KYA_SESSION_ID"] ?? "");
114
+ return match?.[1] ?? "unknown";
115
+ }
116
+ /**
117
+ * The ONLY fields that ever leave the machine. A test pins this exact key set; adding a field here
118
+ * is a privacy change that needs the server validator, docs/telemetry.md and the privacy page updated.
119
+ */
120
+ export function buildPayload(input) {
121
+ return {
122
+ schema: 1,
123
+ installId: input.installId,
124
+ sessionId: input.sessionId,
125
+ event: input.event,
126
+ surface: input.surface,
127
+ cliVersion: CLI_VERSION,
128
+ os: process.platform,
129
+ arch: process.arch,
130
+ nodeMajor: Number.parseInt(process.versions.node, 10),
131
+ hostId: telemetryHostId(input.env),
132
+ gateMode: resolveGateMode({ cwd: input.cwd, env: input.env }),
133
+ hostedLinked: (input.env["KYA_API_KEY"] ?? "").trim() !== "",
134
+ };
135
+ }
136
+ /**
137
+ * POST one JSON body. Returns whether the server accepted it. Never throws: telemetry must not be
138
+ * able to change what the CLI does, so every failure (network, timeout, redirect, non-2xx) is just
139
+ * `false`. The deliberate swallow is the whole point of this function.
140
+ */
141
+ export async function postTelemetry(url, body, fetchImpl = fetch) {
142
+ try {
143
+ const res = await fetchImpl(url, {
144
+ method: "POST",
145
+ headers: {
146
+ "content-type": "application/json",
147
+ "user-agent": `shield-agent-kya-cli/${CLI_VERSION}`,
148
+ },
149
+ body: JSON.stringify(body),
150
+ redirect: "error",
151
+ signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
152
+ });
153
+ return res.ok;
154
+ }
155
+ catch {
156
+ return false;
157
+ }
158
+ }
159
+ const NOOP_BEACON = { stop: async () => { } };
160
+ function heartbeatMs(env, override) {
161
+ if (override !== undefined)
162
+ return override;
163
+ // Test/diagnostic knob, clamped so a typo cannot turn the beacon into a flood.
164
+ const raw = Number(env["KYA_TELEMETRY_INTERVAL_MS"]);
165
+ return Number.isFinite(raw) && raw >= 100 && raw <= 3_600_000 ? raw : DEFAULT_HEARTBEAT_MS;
166
+ }
167
+ /**
168
+ * Start reporting for one long-lived process. A no-op unless the user opted in and nothing overrides
169
+ * it. Writes NOTHING to stdout or stderr (an MCP stdio process owns stdout as its protocol channel).
170
+ */
171
+ export function startSessionBeacon(surface, deps) {
172
+ if (!isTelemetryEnabled(deps.env))
173
+ return NOOP_BEACON;
174
+ const installId = readTelemetryState(deps.env).installId;
175
+ const sessionId = randomUUID();
176
+ const url = telemetryEndpoint(deps.env);
177
+ const fetchImpl = deps.fetchImpl ?? fetch;
178
+ let failures = 0;
179
+ let stopped = false;
180
+ const send = async (event) => {
181
+ if (failures >= MAX_CONSECUTIVE_FAILURES)
182
+ return;
183
+ const ok = await postTelemetry(url, buildPayload({ installId, sessionId, event, surface, env: deps.env, cwd: deps.cwd }), fetchImpl);
184
+ failures = ok ? 0 : failures + 1;
185
+ };
186
+ void send("start");
187
+ const timer = setInterval(() => {
188
+ void send("heartbeat");
189
+ }, heartbeatMs(deps.env, deps.intervalMs));
190
+ timer.unref();
191
+ return {
192
+ async stop() {
193
+ if (stopped)
194
+ return;
195
+ stopped = true;
196
+ clearInterval(timer);
197
+ await send("end");
198
+ },
199
+ };
200
+ }
201
+ // ---------------------------------------------------------------------------------------------
202
+ // Hook ping (hook-only installs have no long-lived process to heartbeat from)
203
+ // ---------------------------------------------------------------------------------------------
204
+ /** At most one ping per this window, however many tool calls fire the hook. */
205
+ export const HOOK_PING_INTERVAL_MS = 24 * 60 * 60_000;
206
+ /** Its mtime is the time of the last ping attempt. Content is empty: nothing to leak or corrupt. */
207
+ export function hookPingStampPath(env) {
208
+ return join(globalConfigDir(env), "telemetry-ping");
209
+ }
210
+ /**
211
+ * Claims today's ping slot: true for exactly one caller per interval. A fresh stamp means someone
212
+ * already did; a stale one is removed and re-created with an exclusive create (`wx`), so of several
213
+ * hooks racing on a stale stamp only the one whose create succeeds gets the slot.
214
+ */
215
+ export function claimHookPingSlot(env, nowMs = Date.now()) {
216
+ const stamp = hookPingStampPath(env);
217
+ try {
218
+ if (nowMs - statSync(stamp).mtimeMs < HOOK_PING_INTERVAL_MS)
219
+ return false;
220
+ unlinkSync(stamp);
221
+ }
222
+ catch {
223
+ /* no stamp yet, or another hook removed it first: fall through to the exclusive create */
224
+ }
225
+ mkdirSync(globalConfigDir(env), { recursive: true, mode: 0o700 });
226
+ try {
227
+ writeFileSync(stamp, "", { flag: "wx" });
228
+ return true;
229
+ }
230
+ catch {
231
+ return false; // EEXIST: another hook won the race
232
+ }
233
+ }
234
+ /**
235
+ * Called by `kya hook` after it has produced its answer. Cheap on the hot path: when telemetry is off
236
+ * or a ping already went out today this is one file read and one stat. Otherwise it claims the day's
237
+ * slot (see {@link claimHookPingSlot}) and starts the helper detached with ignored stdio, so the
238
+ * hook's stdout, stderr and exit code are untouched and it never waits. `host` is the hook's `--host`
239
+ * (claude, grok, ...), handed to the helper so the host mix stays meaningful for hook-only installs.
240
+ * A failed ping is not retried until tomorrow: a spawn storm while offline would be worse than a gap.
241
+ * Never throws. Returns whether a helper was started.
242
+ */
243
+ export function maybeSpawnHookPing(deps) {
244
+ try {
245
+ if (!isTelemetryEnabled(deps.env))
246
+ return false;
247
+ const entry = deps.entry ?? process.argv[1];
248
+ if (entry === undefined)
249
+ return false; // before claiming: a skipped spawn must not burn the day's slot
250
+ if (!claimHookPingSlot(deps.env, deps.nowMs))
251
+ return false;
252
+ const helperEnv = deps.host !== undefined && /^[a-z][a-z0-9-]{0,31}$/.test(deps.host) && deps.env["KYA_SESSION_ID"] === undefined
253
+ ? { ...deps.env, KYA_SESSION_ID: `mcp:${deps.host}` } // the form telemetryHostId reads
254
+ : deps.env;
255
+ const child = (deps.spawnImpl ?? spawn)(process.execPath, [entry, "telemetry", "ping"], { detached: true, stdio: "ignore", env: helperEnv, cwd: deps.cwd, windowsHide: true });
256
+ child.on("error", () => undefined);
257
+ child.unref();
258
+ return true;
259
+ }
260
+ catch {
261
+ return false;
262
+ }
263
+ }
264
+ /** The helper's job (`kya telemetry ping`): one `ping` as surface `hook`, same gates as every beacon. */
265
+ export async function sendHookPing(env, cwd, fetchImpl = fetch) {
266
+ if (!isTelemetryEnabled(env))
267
+ return false;
268
+ const installId = readTelemetryState(env).installId;
269
+ return postTelemetry(telemetryEndpoint(env), buildPayload({ installId, sessionId: randomUUID(), event: "ping", surface: "hook", env, cwd }), fetchImpl);
270
+ }
271
+ export const CONSENT_NOTICE = [
272
+ "Share anonymous usage stats to help improve KYA?",
273
+ " Sends: a random install ID, KYA version, OS/arch, Node version, which KYA part is running.",
274
+ " Never: file paths, repo names, prompts, tool arguments, or code.",
275
+ " See exactly what is sent with `kya telemetry show`; change your mind any time with `kya telemetry off`.",
276
+ ];
277
+ function defaultAsk(question) {
278
+ return new Promise((resolve) => {
279
+ // Prompt on stderr so stdout stays clean for anything piping the command's output.
280
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
281
+ rl.question(`${question} `, (answer) => {
282
+ rl.close();
283
+ resolve(answer);
284
+ });
285
+ });
286
+ }
287
+ /**
288
+ * Ask once, on an interactive terminal, in the setup commands (`start`, `init`, `connect`). Strict
289
+ * opt-in: only an explicit `y` / `yes` enables; empty input, anything else, or closing the prompt is No.
290
+ * Skipped when already answered, when an override forces telemetry off, and when not interactive
291
+ * (nothing is saved then, so the next interactive run can ask).
292
+ */
293
+ export async function maybePromptConsent(io, env) {
294
+ if (telemetryDisabledReason(env) !== undefined)
295
+ return "skipped";
296
+ if (readTelemetryState(env).askedAt !== undefined)
297
+ return "skipped";
298
+ const interactive = io.isTty ?? Boolean(process.stdin.isTTY && process.stderr.isTTY);
299
+ if (!interactive)
300
+ return "skipped";
301
+ for (const line of CONSENT_NOTICE)
302
+ io.error(line);
303
+ const answer = await (io.ask ?? defaultAsk)("Share anonymous usage stats? [y/N]");
304
+ const yes = /^y(es)?$/i.test(answer.trim());
305
+ try {
306
+ writeTelemetryState(env, {
307
+ enabled: yes,
308
+ ...(yes ? { installId: randomUUID() } : {}),
309
+ askedAt: new Date().toISOString(),
310
+ });
311
+ }
312
+ catch {
313
+ io.error("(could not save your telemetry choice; nothing will be sent)");
314
+ return "no";
315
+ }
316
+ io.error(yes
317
+ ? "Thanks. Telemetry is on. Turn it off any time: kya telemetry off"
318
+ : "No problem, nothing will be sent. Turn it on later: kya telemetry on");
319
+ return yes ? "yes" : "no";
320
+ }
321
+ const NEVER_SENT = "Never sent: file paths, repo names, host or user names, environment variables, command arguments, " +
322
+ "tool names, prompts, code, trail contents, API keys, or email addresses.";
323
+ export async function runTelemetryCommand(input, io, env, cwd, fetchImpl = fetch) {
324
+ const state = readTelemetryState(env);
325
+ const reason = telemetryDisabledReason(env);
326
+ switch (input.sub ?? "status") {
327
+ case "status": {
328
+ const effective = isTelemetryEnabled(env);
329
+ if (input.json) {
330
+ io.log(JSON.stringify({
331
+ enabled: state.enabled ?? null,
332
+ effective,
333
+ installId: state.installId ?? null,
334
+ endpoint: telemetryEndpoint(env),
335
+ overriddenBy: reason ?? null,
336
+ }, null, 2));
337
+ return 0;
338
+ }
339
+ io.log(`Telemetry: ${state.enabled === true ? "on" : state.enabled === false ? "off" : "not asked yet"}`);
340
+ if (state.enabled === true && reason !== undefined) {
341
+ io.log(`Overridden for this process: ${reason}. Nothing is sent from here.`);
342
+ }
343
+ io.log(`Install ID: ${state.installId ?? "none"}`);
344
+ io.log(`Endpoint: ${telemetryEndpoint(env)}`);
345
+ io.log("See exactly what is sent: kya telemetry show");
346
+ return 0;
347
+ }
348
+ case "on": {
349
+ writeTelemetryState(env, {
350
+ enabled: true,
351
+ installId: state.installId ?? randomUUID(),
352
+ askedAt: state.askedAt ?? new Date().toISOString(),
353
+ });
354
+ io.log("Telemetry is on. See what is sent: kya telemetry show. Turn off: kya telemetry off");
355
+ if (reason !== undefined)
356
+ io.log(`Note: ${reason}, so nothing is sent from this shell.`);
357
+ return 0;
358
+ }
359
+ case "off": {
360
+ // One timestamp for every write below: a purge must not drop the "already asked" marker, or the
361
+ // next interactive setup command would ask the consent question again after an explicit erase.
362
+ const askedAt = state.askedAt ?? new Date().toISOString();
363
+ writeTelemetryState(env, {
364
+ enabled: false,
365
+ ...(state.installId !== undefined ? { installId: state.installId } : {}),
366
+ askedAt,
367
+ });
368
+ io.log("Telemetry is off. Nothing will be sent.");
369
+ if (!input.purge)
370
+ return 0;
371
+ if (state.installId === undefined) {
372
+ io.log("No install ID on this machine, so there is nothing to erase.");
373
+ return 0;
374
+ }
375
+ const erased = await postTelemetry(eraseEndpoint(env), { installId: state.installId }, fetchImpl);
376
+ if (!erased) {
377
+ io.error("Could not reach the server to erase your data. Your install ID is kept so you can retry: kya telemetry off --purge");
378
+ return 1;
379
+ }
380
+ writeTelemetryState(env, { enabled: false, askedAt });
381
+ io.log("Erased everything stored for this install and removed the local install ID.");
382
+ return 0;
383
+ }
384
+ case "ping": {
385
+ // Internal: started detached by `kya hook`. Silent, always exit 0 (nothing waits on the result).
386
+ await sendHookPing(env, cwd, fetchImpl);
387
+ return 0;
388
+ }
389
+ case "show": {
390
+ const sample = buildPayload({
391
+ installId: state.installId ?? "<random id, created only when you opt in>",
392
+ sessionId: "<random per process>",
393
+ event: "heartbeat",
394
+ surface: "mcp-stdio",
395
+ env,
396
+ cwd,
397
+ });
398
+ if (input.json) {
399
+ io.log(JSON.stringify(sample, null, 2));
400
+ return 0;
401
+ }
402
+ io.log("Sent about every 5 minutes while a KYA process (MCP gate, report, gateway) is running,");
403
+ io.log('and as one `event: "ping"`, `surface: "hook"` message per day when only `kya hook` is used:');
404
+ io.log(JSON.stringify(sample, null, 2));
405
+ io.log(NEVER_SENT);
406
+ io.log(`Endpoint: ${telemetryEndpoint(env)}`);
407
+ return 0;
408
+ }
409
+ case "reset": {
410
+ if (state.enabled !== true && state.installId === undefined) {
411
+ io.log("Nothing to reset: telemetry is off and there is no install ID.");
412
+ return 0;
413
+ }
414
+ writeTelemetryState(env, {
415
+ ...(state.enabled !== undefined ? { enabled: state.enabled } : {}),
416
+ installId: randomUUID(),
417
+ askedAt: state.askedAt ?? new Date().toISOString(),
418
+ });
419
+ io.log("Generated a new random install ID. The old one is no longer linked to this machine.");
420
+ return 0;
421
+ }
422
+ default:
423
+ io.error("Usage: kya telemetry [status|on|off [--purge]|show|reset] [--json]");
424
+ return 2;
425
+ }
426
+ }
427
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/droid/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Droid (Factory) + Shield KYA
2
2
 
3
- Preferred path is Droid's own CLI: `droid mcp add shield-kya "npx --no-install @shield-agent/kya@0.21.0 serve-mcp --stdio" --env KYA_BASE_URL=https://shield-agent.com --env KYA_API_KEY=$KYA_API_KEY --env KYA_HOST=ide`.
3
+ Preferred path is Droid's own CLI: `droid mcp add shield-kya "npx --no-install @shield-agent/kya@0.22.0 serve-mcp --stdio" --env KYA_BASE_URL=https://shield-agent.com --env KYA_API_KEY=$KYA_API_KEY --env KYA_HOST=ide`.
4
4
 
5
5
  `mcp.example.json` shows the expected on-disk shape (`~/.factory/mcp.json`) — **schema not yet verified against a live Droid install**; treat as a starting point and prefer `droid mcp add`.
6
6
 
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "shield-kya": {
4
4
  "command": "npx",
5
- "args": ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "args": ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "env": {
7
7
  "KYA_BASE_URL": "https://shield-agent.com",
8
8
  "KYA_API_KEY": "${KYA_API_KEY}",
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "shield-kya": {
4
4
  "command": "npx",
5
- "args": ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "args": ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "env": {
7
7
  "KYA_BASE_URL": "https://shield-agent.com",
8
8
  "KYA_API_KEY": "${KYA_API_KEY}",
package/grok/README.md CHANGED
@@ -40,7 +40,7 @@ chat = client.chat.create(
40
40
  There is no grok.com stdio path. For a local agent host use the same stdio launch as Claude:
41
41
 
42
42
  ```bash
43
- npx --no-install @shield-agent/kya@0.21.0 serve-mcp --stdio
43
+ npx --no-install @shield-agent/kya@0.22.0 serve-mcp --stdio
44
44
  ```
45
45
 
46
46
  Env: `KYA_BASE_URL`, `KYA_API_KEY`, `KYA_HOST`. Codex and Gemini example configs in this package show the full snippets.
@@ -2,7 +2,7 @@
2
2
  "mcp": {
3
3
  "shield-kya": {
4
4
  "type": "local",
5
- "command": ["npx", "--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "command": ["npx", "--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "enabled": true,
7
7
  "environment": {
8
8
  "KYA_BASE_URL": "https://shield-agent.com",
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "shield-kya": {
4
4
  "command": "npx",
5
- "args": ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "args": ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "env": {
7
7
  "KYA_BASE_URL": "https://shield-agent.com",
8
8
  "KYA_API_KEY": "${KYA_API_KEY}",
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "shield-kya": {
4
4
  "command": "npx",
5
- "args": ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "args": ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "env": {
7
7
  "KYA_BASE_URL": "https://shield-agent.com",
8
8
  "KYA_API_KEY": "${KYA_API_KEY}",
package/manifest.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "shield-kya",
4
4
  "display_name": "Shield KYA",
5
- "version": "0.21.0",
5
+ "version": "0.22.0",
6
6
  "description": "Know Your Agent MCP gate: ALLOW / DENY / REQUIRE_APPROVE. Sole PEP is Shield.",
7
7
  "long_description": "Local Claude Desktop extension that runs the packaged `dist/cli.js serve-mcp --stdio` against your Shield control plane (local or https://shield-agent.com). Tools evaluate policy, ingest session risk, and open Hold tickets. They never execute irreversible side effects.",
8
8
  "author": {
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "shield-kya": {
4
4
  "command": "npx",
5
- "args": ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "args": ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "env": {
7
7
  "KYA_BASE_URL": "https://shield-agent.com",
8
8
  "KYA_API_KEY": "${KYA_API_KEY}",
package/mcp.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "shield-kya": {
4
4
  "description": "Know Your Agent local MCP gate: wrap-before-write, named-agent registry, Hold/Clear.",
5
5
  "command": "npx",
6
- "args": ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
6
+ "args": ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
7
7
  "env": {
8
8
  "KYA_BASE_URL": "${KYA_BASE_URL}",
9
9
  "KYA_API_KEY": "${KYA_API_KEY}",
@@ -11,7 +11,7 @@
11
11
  # --- Local stdio (OSS) ---
12
12
  [mcp_servers.shield-kya]
13
13
  command = "npx"
14
- args = ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"]
14
+ args = ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"]
15
15
  startup_timeout_sec = 20
16
16
  env_vars = ["KYA_BASE_URL", "KYA_API_KEY", "KYA_HOST", "KYA_AGENT_ID"]
17
17
 
@@ -2,7 +2,7 @@
2
2
  "mcp": {
3
3
  "shield-kya": {
4
4
  "type": "local",
5
- "command": ["npx", "--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "command": ["npx", "--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "enabled": true,
7
7
  "environment": {
8
8
  "KYA_BASE_URL": "https://shield-agent.com",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shield-agent/kya",
3
- "version": "0.21.0",
3
+ "version": "0.22.0",
4
4
  "description": "AI agents audit trail & traceability — gate every tool call (Allow / Review / Deny), live activity dashboard, and continuous trust-baseline certification.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -104,6 +104,7 @@
104
104
  "test:watch": "vitest",
105
105
  "test:coverage": "vitest run --coverage",
106
106
  "pack:check": "pnpm run build && pnpm pack --pack-destination /tmp && node dist/cli.js --help",
107
- "sync:version": "node scripts/sync-version.mjs"
107
+ "sync:version": "node scripts/sync-version.mjs",
108
+ "check:version": "node scripts/check-version-pins.mjs"
108
109
  }
109
110
  }
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "shield-kya": {
4
4
  "command": "npx",
5
- "args": ["--no-install", "@shield-agent/kya@0.21.0", "serve-mcp", "--stdio"],
5
+ "args": ["--no-install", "@shield-agent/kya@0.22.0", "serve-mcp", "--stdio"],
6
6
  "env": {
7
7
  "KYA_BASE_URL": "https://shield-agent.com",
8
8
  "KYA_API_KEY": "${KYA_API_KEY}",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/The-Pixel-Boys/shield-kya",
8
8
  "source": "github"
9
9
  },
10
- "version": "0.21.0",
10
+ "version": "0.22.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@shield-agent/kya",
15
- "version": "0.21.0",
15
+ "version": "0.22.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },