@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.
- package/.mcp.json +1 -1
- package/LIMITATIONS.md +1 -0
- package/README.md +23 -6
- package/amp/settings.example.json +1 -1
- package/claude/claude_desktop_config.example.json +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -23
- package/dist/cli.js.map +1 -1
- package/dist/commands/gate-serve.d.ts.map +1 -1
- package/dist/commands/gate-serve.js +16 -2
- package/dist/commands/gate-serve.js.map +1 -1
- package/dist/commands/receipt.d.ts +5 -2
- package/dist/commands/receipt.d.ts.map +1 -1
- package/dist/commands/receipt.js +7 -4
- package/dist/commands/receipt.js.map +1 -1
- package/dist/receipt/share.d.ts +19 -0
- package/dist/receipt/share.d.ts.map +1 -1
- package/dist/receipt/share.js +65 -2
- package/dist/receipt/share.js.map +1 -1
- package/dist/telemetry.d.ts +135 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +427 -0
- package/dist/telemetry.js.map +1 -0
- package/droid/README.md +1 -1
- package/droid/mcp.example.json +1 -1
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +1 -1
- package/kilo/kilo.example.json +1 -1
- package/kimi/mcp.example.json +1 -1
- package/kiro/mcp.example.json +1 -1
- package/manifest.json +1 -1
- package/mastracode/mcp.example.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/opencode/opencode.example.json +1 -1
- package/package.json +3 -2
- package/qwen/settings.example.json +1 -1
- package/server.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/commands/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/commands/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AA6BtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAsB,EACtB,KAAmG;IAEnG,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,oBAAoB,CAAC;IAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAE3D,8EAA8E;IAC9E,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC7B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,SAAS;QACT,IAAI;QACJ,IAAI,EAAE,KAAK;QACX,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAEvC,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACvD,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE1B,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAElC,MAAM,IAAI,GAAqB;QAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC/B,IAAI;KACL,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAErB,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,MAAM,CAAC,GAAG;QACnB,SAAS,EAAE,MAAM,CAAC,GAAG;QACrB,YAAY,EAAE,MAAM,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAsB,EACtB,KAAsF,EACtF,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,oBAAoB,CAAC;IAC3B,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,qBAAqB,CAAC,OAAO,EAAE;QACpC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;QAC1C,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;KACjC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC;QACzE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAC9C,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM;QACtE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC5D,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;QAC7D,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;KAC3F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAgB;IACjD,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,UAAU,GAAG;QAC9B,WAAW,CAAC,CAAC,UAAU,EAAE;QACzB,SAAS,CAAC,CAAC,QAAQ,EAAE;QACrB,SAAS,CAAC,CAAC,QAAQ,EAAE;QACrB,OAAO,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC;IACF,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,GAAG,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IACzF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/receipt/share.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type ReceiptModel } from "./render-receipt.js";
|
|
|
2
2
|
export declare const SHARE_DEFAULT_BASE_URL = "https://shield-agent.com";
|
|
3
3
|
export declare const SHARE_PATH = "/api/v1/share/reports";
|
|
4
4
|
export declare const SHARE_TIMEOUT_MS = 15000;
|
|
5
|
+
export declare const SHARE_MAX_RETRIES = 3;
|
|
5
6
|
export interface ShareStats {
|
|
6
7
|
readonly total: number;
|
|
7
8
|
readonly allow: number;
|
|
@@ -55,11 +56,29 @@ export type ShareResult = {
|
|
|
55
56
|
} | {
|
|
56
57
|
readonly ok: false;
|
|
57
58
|
readonly error: string;
|
|
59
|
+
/** HTTP status when the failure came from a response (absent on network/timeout). */
|
|
60
|
+
readonly status?: number;
|
|
61
|
+
/** Parsed Retry-After seconds from a 429, when present. */
|
|
62
|
+
readonly retryAfterSeconds?: number;
|
|
58
63
|
};
|
|
64
|
+
/** Clamp a --share-retries flag value: negative/non-numeric → 0, cap at SHARE_MAX_RETRIES. */
|
|
65
|
+
export declare function clampShareRetries(raw: string | undefined): number;
|
|
59
66
|
/** POST the payload; 15s timeout. Never throws — failures come back as {ok:false}. */
|
|
60
67
|
export declare function shareReceiptPayload(payload: SharePayload, opts: {
|
|
61
68
|
readonly baseUrl: string;
|
|
62
69
|
readonly fetchImpl?: typeof fetch;
|
|
63
70
|
readonly timeoutMs?: number;
|
|
64
71
|
}): Promise<ShareResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Opt-in bounded retry around the single-attempt shareReceiptPayload: at most
|
|
74
|
+
* SHARE_MAX_RETRIES retries on 429/5xx/network failures, exponential backoff
|
|
75
|
+
* with jitter, honoring Retry-After. Default (retries 0) stays single-attempt.
|
|
76
|
+
*/
|
|
77
|
+
export declare function shareReceiptWithRetry(payload: SharePayload, opts: {
|
|
78
|
+
readonly baseUrl: string;
|
|
79
|
+
readonly fetchImpl?: typeof fetch;
|
|
80
|
+
readonly timeoutMs?: number;
|
|
81
|
+
readonly retries?: number;
|
|
82
|
+
readonly sleep?: (ms: number) => Promise<void>;
|
|
83
|
+
}): Promise<ShareResult>;
|
|
65
84
|
//# sourceMappingURL=share.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/receipt/share.ts"],"names":[],"mappings":"AAUA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzE,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AACjE,eAAO,MAAM,UAAU,0BAA0B,CAAC;AAClD,eAAO,MAAM,gBAAgB,QAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/receipt/share.ts"],"names":[],"mappings":"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"}
|
package/dist/receipt/share.js
CHANGED
|
@@ -12,6 +12,12 @@ import { aggregateEvents } from "./render-receipt.js";
|
|
|
12
12
|
export const SHARE_DEFAULT_BASE_URL = "https://shield-agent.com";
|
|
13
13
|
export const SHARE_PATH = "/api/v1/share/reports";
|
|
14
14
|
export const SHARE_TIMEOUT_MS = 15_000;
|
|
15
|
+
export const SHARE_MAX_RETRIES = 3;
|
|
16
|
+
/** Exponential backoff per retry attempt (index 0 = first retry). */
|
|
17
|
+
const RETRY_BASE_DELAYS_MS = [1_000, 2_000, 4_000];
|
|
18
|
+
const RETRY_JITTER_MS = 250;
|
|
19
|
+
/** Cap on a server-supplied Retry-After so a hostile header can't park the CLI. */
|
|
20
|
+
const RETRY_AFTER_CAP_S = 60;
|
|
15
21
|
/**
|
|
16
22
|
* Roll the model into the share payload. Only fields that are already public
|
|
17
23
|
* labels or aggregates leave the machine: verdict counts, product/reason
|
|
@@ -69,7 +75,24 @@ export function buildSharePayload(model) {
|
|
|
69
75
|
/** Resolve the endpoint base: --share-url flag > KYA_SHARE_URL > default. */
|
|
70
76
|
export function shareBaseUrl(override, env) {
|
|
71
77
|
const raw = override?.trim() || env.KYA_SHARE_URL?.trim() || SHARE_DEFAULT_BASE_URL;
|
|
72
|
-
|
|
78
|
+
let end = raw.length;
|
|
79
|
+
while (end > 0 && raw.charCodeAt(end - 1) === 47 /* / */)
|
|
80
|
+
end--;
|
|
81
|
+
return raw.slice(0, end);
|
|
82
|
+
}
|
|
83
|
+
/** Parse a Retry-After header as integer seconds; undefined when absent/malformed. */
|
|
84
|
+
function parseRetryAfterSeconds(raw) {
|
|
85
|
+
if (!raw)
|
|
86
|
+
return undefined;
|
|
87
|
+
const n = Number.parseInt(raw.trim(), 10);
|
|
88
|
+
return Number.isFinite(n) && n >= 0 ? n : undefined;
|
|
89
|
+
}
|
|
90
|
+
/** Clamp a --share-retries flag value: negative/non-numeric → 0, cap at SHARE_MAX_RETRIES. */
|
|
91
|
+
export function clampShareRetries(raw) {
|
|
92
|
+
const n = raw ? Number.parseInt(raw, 10) : 0;
|
|
93
|
+
if (!Number.isFinite(n) || n < 0)
|
|
94
|
+
return 0;
|
|
95
|
+
return Math.min(n, SHARE_MAX_RETRIES);
|
|
73
96
|
}
|
|
74
97
|
/** POST the payload; 15s timeout. Never throws — failures come back as {ok:false}. */
|
|
75
98
|
export async function shareReceiptPayload(payload, opts) {
|
|
@@ -94,7 +117,18 @@ export async function shareReceiptPayload(payload, opts) {
|
|
|
94
117
|
};
|
|
95
118
|
}
|
|
96
119
|
if (res.status !== 200 && res.status !== 201) {
|
|
97
|
-
|
|
120
|
+
if (res.status === 429) {
|
|
121
|
+
const retryAfterSeconds = parseRetryAfterSeconds(res.headers.get("Retry-After"));
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
status: 429,
|
|
125
|
+
retryAfterSeconds,
|
|
126
|
+
error: retryAfterSeconds != null
|
|
127
|
+
? `share failed: rate limited — retry in ~${retryAfterSeconds}s`
|
|
128
|
+
: "share failed: rate limited — retry later",
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return { ok: false, status: res.status, error: `share failed: HTTP ${res.status}` };
|
|
98
132
|
}
|
|
99
133
|
const data = (await res.json().catch(() => null));
|
|
100
134
|
if (!data || typeof data.url !== "string" || !data.url) {
|
|
@@ -106,4 +140,33 @@ export async function shareReceiptPayload(payload, opts) {
|
|
|
106
140
|
clearTimeout(timer);
|
|
107
141
|
}
|
|
108
142
|
}
|
|
143
|
+
/** Retryable failures: 429, 5xx, or network/timeout. 4xx validation errors are final. */
|
|
144
|
+
function isShareRetryable(result) {
|
|
145
|
+
return !result.ok && (result.status === undefined || result.status === 429 || result.status >= 500);
|
|
146
|
+
}
|
|
147
|
+
/** Backoff for the next attempt: Retry-After wins (capped), else exponential + jitter. */
|
|
148
|
+
function shareRetryDelayMs(failure, attempt) {
|
|
149
|
+
if (failure.retryAfterSeconds != null) {
|
|
150
|
+
return Math.min(failure.retryAfterSeconds, RETRY_AFTER_CAP_S) * 1000;
|
|
151
|
+
}
|
|
152
|
+
const base = RETRY_BASE_DELAYS_MS[Math.min(attempt, RETRY_BASE_DELAYS_MS.length - 1)];
|
|
153
|
+
return base + Math.floor(Math.random() * (RETRY_JITTER_MS + 1));
|
|
154
|
+
}
|
|
155
|
+
const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
156
|
+
/**
|
|
157
|
+
* Opt-in bounded retry around the single-attempt shareReceiptPayload: at most
|
|
158
|
+
* SHARE_MAX_RETRIES retries on 429/5xx/network failures, exponential backoff
|
|
159
|
+
* with jitter, honoring Retry-After. Default (retries 0) stays single-attempt.
|
|
160
|
+
*/
|
|
161
|
+
export async function shareReceiptWithRetry(payload, opts) {
|
|
162
|
+
const requested = opts.retries ?? 0;
|
|
163
|
+
const retries = Number.isFinite(requested) && requested > 0 ? Math.min(Math.floor(requested), SHARE_MAX_RETRIES) : 0;
|
|
164
|
+
const sleep = opts.sleep ?? defaultSleep;
|
|
165
|
+
for (let attempt = 0;; attempt++) {
|
|
166
|
+
const result = await shareReceiptPayload(payload, opts);
|
|
167
|
+
if (result.ok || !isShareRetryable(result) || attempt >= retries)
|
|
168
|
+
return result;
|
|
169
|
+
await sleep(shareRetryDelayMs(result, attempt));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
109
172
|
//# sourceMappingURL=share.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/receipt/share.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAqB,MAAM,qBAAqB,CAAC;AAEzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/receipt/share.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
export type TelemetrySurface = "mcp-stdio" | "mcp-http" | "report" | "gateway" | "hook";
|
|
2
|
+
export type TelemetryEventKind = "start" | "heartbeat" | "end" | "ping";
|
|
3
|
+
export interface TelemetryState {
|
|
4
|
+
/** true = opted in, false = opted out, undefined = never answered. */
|
|
5
|
+
readonly enabled?: boolean;
|
|
6
|
+
/** Random UUID, created only when the user opts in. Never derived from the machine or user. */
|
|
7
|
+
readonly installId?: string;
|
|
8
|
+
/** When the question was answered; its presence means "do not ask again". */
|
|
9
|
+
readonly askedAt?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface TelemetryPayload {
|
|
12
|
+
readonly schema: 1;
|
|
13
|
+
readonly installId: string;
|
|
14
|
+
readonly sessionId: string;
|
|
15
|
+
readonly event: TelemetryEventKind;
|
|
16
|
+
readonly surface: TelemetrySurface;
|
|
17
|
+
readonly cliVersion: string;
|
|
18
|
+
readonly os: string;
|
|
19
|
+
readonly arch: string;
|
|
20
|
+
readonly nodeMajor: number;
|
|
21
|
+
readonly hostId: string;
|
|
22
|
+
readonly gateMode: string;
|
|
23
|
+
readonly hostedLinked: boolean;
|
|
24
|
+
}
|
|
25
|
+
export type FetchLike = (input: string, init?: RequestInit) => Promise<Pick<Response, "ok" | "status">>;
|
|
26
|
+
export declare const DEFAULT_TELEMETRY_ENDPOINT = "https://shield-agent.com/api/v1/telemetry/kya";
|
|
27
|
+
export declare function telemetryStatePath(env: NodeJS.ProcessEnv): string;
|
|
28
|
+
/** Tolerant read: a missing, corrupt or hand-edited file is "never asked", never an error. */
|
|
29
|
+
export declare function readTelemetryState(env: NodeJS.ProcessEnv): TelemetryState;
|
|
30
|
+
export declare function writeTelemetryState(env: NodeJS.ProcessEnv, state: TelemetryState): void;
|
|
31
|
+
/** Why telemetry is forced off for THIS process regardless of the saved answer, or undefined. */
|
|
32
|
+
export declare function telemetryDisabledReason(env: NodeJS.ProcessEnv): string | undefined;
|
|
33
|
+
/** True only when the user opted in AND nothing overrides it for this process. */
|
|
34
|
+
export declare function isTelemetryEnabled(env: NodeJS.ProcessEnv): boolean;
|
|
35
|
+
/** https, or http on a loopback host (tests, self-hosting). Anything else falls back to the default. */
|
|
36
|
+
export declare function telemetryEndpoint(env: NodeJS.ProcessEnv): string;
|
|
37
|
+
/** Host registry slug from the session id `kya connect` writes (`mcp:<host>`), else "unknown". */
|
|
38
|
+
export declare function telemetryHostId(env: NodeJS.ProcessEnv): string;
|
|
39
|
+
/**
|
|
40
|
+
* The ONLY fields that ever leave the machine. A test pins this exact key set; adding a field here
|
|
41
|
+
* is a privacy change that needs the server validator, docs/telemetry.md and the privacy page updated.
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildPayload(input: {
|
|
44
|
+
readonly installId: string;
|
|
45
|
+
readonly sessionId: string;
|
|
46
|
+
readonly event: TelemetryEventKind;
|
|
47
|
+
readonly surface: TelemetrySurface;
|
|
48
|
+
readonly env: NodeJS.ProcessEnv;
|
|
49
|
+
readonly cwd: string;
|
|
50
|
+
}): TelemetryPayload;
|
|
51
|
+
/**
|
|
52
|
+
* POST one JSON body. Returns whether the server accepted it. Never throws: telemetry must not be
|
|
53
|
+
* able to change what the CLI does, so every failure (network, timeout, redirect, non-2xx) is just
|
|
54
|
+
* `false`. The deliberate swallow is the whole point of this function.
|
|
55
|
+
*/
|
|
56
|
+
export declare function postTelemetry(url: string, body: unknown, fetchImpl?: FetchLike): Promise<boolean>;
|
|
57
|
+
export interface SessionBeacon {
|
|
58
|
+
/** Sends `end` (bounded by the send timeout) and stops the heartbeat. Idempotent. */
|
|
59
|
+
stop(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Start reporting for one long-lived process. A no-op unless the user opted in and nothing overrides
|
|
63
|
+
* it. Writes NOTHING to stdout or stderr (an MCP stdio process owns stdout as its protocol channel).
|
|
64
|
+
*/
|
|
65
|
+
export declare function startSessionBeacon(surface: TelemetrySurface, deps: {
|
|
66
|
+
readonly env: NodeJS.ProcessEnv;
|
|
67
|
+
readonly cwd: string;
|
|
68
|
+
readonly fetchImpl?: FetchLike;
|
|
69
|
+
readonly intervalMs?: number;
|
|
70
|
+
}): SessionBeacon;
|
|
71
|
+
/** At most one ping per this window, however many tool calls fire the hook. */
|
|
72
|
+
export declare const HOOK_PING_INTERVAL_MS: number;
|
|
73
|
+
/** Its mtime is the time of the last ping attempt. Content is empty: nothing to leak or corrupt. */
|
|
74
|
+
export declare function hookPingStampPath(env: NodeJS.ProcessEnv): string;
|
|
75
|
+
type SpawnLike = (command: string, args: readonly string[], options: {
|
|
76
|
+
detached: boolean;
|
|
77
|
+
stdio: "ignore";
|
|
78
|
+
env: NodeJS.ProcessEnv;
|
|
79
|
+
cwd: string;
|
|
80
|
+
windowsHide: boolean;
|
|
81
|
+
}) => {
|
|
82
|
+
unref(): void;
|
|
83
|
+
on(event: "error", listener: () => void): unknown;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Claims today's ping slot: true for exactly one caller per interval. A fresh stamp means someone
|
|
87
|
+
* already did; a stale one is removed and re-created with an exclusive create (`wx`), so of several
|
|
88
|
+
* hooks racing on a stale stamp only the one whose create succeeds gets the slot.
|
|
89
|
+
*/
|
|
90
|
+
export declare function claimHookPingSlot(env: NodeJS.ProcessEnv, nowMs?: number): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Called by `kya hook` after it has produced its answer. Cheap on the hot path: when telemetry is off
|
|
93
|
+
* or a ping already went out today this is one file read and one stat. Otherwise it claims the day's
|
|
94
|
+
* slot (see {@link claimHookPingSlot}) and starts the helper detached with ignored stdio, so the
|
|
95
|
+
* hook's stdout, stderr and exit code are untouched and it never waits. `host` is the hook's `--host`
|
|
96
|
+
* (claude, grok, ...), handed to the helper so the host mix stays meaningful for hook-only installs.
|
|
97
|
+
* A failed ping is not retried until tomorrow: a spawn storm while offline would be worse than a gap.
|
|
98
|
+
* Never throws. Returns whether a helper was started.
|
|
99
|
+
*/
|
|
100
|
+
export declare function maybeSpawnHookPing(deps: {
|
|
101
|
+
readonly env: NodeJS.ProcessEnv;
|
|
102
|
+
readonly cwd: string;
|
|
103
|
+
readonly host?: string;
|
|
104
|
+
readonly entry?: string;
|
|
105
|
+
readonly spawnImpl?: SpawnLike;
|
|
106
|
+
readonly nowMs?: number;
|
|
107
|
+
}): boolean;
|
|
108
|
+
/** The helper's job (`kya telemetry ping`): one `ping` as surface `hook`, same gates as every beacon. */
|
|
109
|
+
export declare function sendHookPing(env: NodeJS.ProcessEnv, cwd: string, fetchImpl?: FetchLike): Promise<boolean>;
|
|
110
|
+
export interface ConsentIo {
|
|
111
|
+
readonly error: (msg: string) => void;
|
|
112
|
+
/** Test seam: force interactive / non-interactive. Defaults to "stdin and stderr are TTYs". */
|
|
113
|
+
readonly isTty?: boolean;
|
|
114
|
+
/** Test seam: returns the raw answer line. Defaults to a readline prompt on stdin/stderr. */
|
|
115
|
+
readonly ask?: (question: string) => Promise<string>;
|
|
116
|
+
}
|
|
117
|
+
export declare const CONSENT_NOTICE: string[];
|
|
118
|
+
/**
|
|
119
|
+
* Ask once, on an interactive terminal, in the setup commands (`start`, `init`, `connect`). Strict
|
|
120
|
+
* opt-in: only an explicit `y` / `yes` enables; empty input, anything else, or closing the prompt is No.
|
|
121
|
+
* Skipped when already answered, when an override forces telemetry off, and when not interactive
|
|
122
|
+
* (nothing is saved then, so the next interactive run can ask).
|
|
123
|
+
*/
|
|
124
|
+
export declare function maybePromptConsent(io: ConsentIo, env: NodeJS.ProcessEnv): Promise<"yes" | "no" | "skipped">;
|
|
125
|
+
export interface TelemetryCommandIo {
|
|
126
|
+
readonly log: (msg: string) => void;
|
|
127
|
+
readonly error: (msg: string) => void;
|
|
128
|
+
}
|
|
129
|
+
export declare function runTelemetryCommand(input: {
|
|
130
|
+
readonly sub: string | undefined;
|
|
131
|
+
readonly purge: boolean;
|
|
132
|
+
readonly json: boolean;
|
|
133
|
+
}, io: TelemetryCommandIo, env: NodeJS.ProcessEnv, cwd: string, fetchImpl?: FetchLike): Promise<number>;
|
|
134
|
+
export {};
|
|
135
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|