@shield-agent/kya 0.21.0 → 0.23.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 +90 -31
- 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/certify/attest.js +5 -5
- package/dist/certify/catalog.d.ts +1 -1
- package/dist/certify/catalog.js +3 -3
- package/dist/certify/context.js +1 -1
- package/dist/certify/evaluate.d.ts +2 -2
- package/dist/certify/evaluate.js +12 -12
- package/dist/certify/live.js +2 -2
- package/dist/certify/render.d.ts +1 -1
- package/dist/certify/render.js +10 -10
- package/dist/cli.d.ts +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +110 -37
- package/dist/cli.js.map +1 -1
- package/dist/commands/certify.d.ts +1 -1
- package/dist/commands/certify.js +3 -3
- package/dist/commands/connect.d.ts +2 -2
- package/dist/commands/connect.js +22 -22
- package/dist/commands/dash.js +4 -4
- package/dist/commands/gate-serve.d.ts.map +1 -1
- package/dist/commands/gate-serve.js +19 -5
- package/dist/commands/gate-serve.js.map +1 -1
- package/dist/commands/gate.d.ts +1 -1
- package/dist/commands/gate.js +16 -16
- package/dist/commands/hook.d.ts +1 -1
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +55 -18
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/import-traces.d.ts +16 -0
- package/dist/commands/import-traces.d.ts.map +1 -0
- package/dist/commands/import-traces.js +18 -0
- package/dist/commands/import-traces.js.map +1 -0
- package/dist/commands/init.js +1 -1
- package/dist/commands/investigate.d.ts +13 -0
- package/dist/commands/investigate.d.ts.map +1 -0
- package/dist/commands/investigate.js +22 -0
- package/dist/commands/investigate.js.map +1 -0
- package/dist/commands/notify-flush.d.ts +2 -0
- package/dist/commands/notify-flush.d.ts.map +1 -0
- package/dist/commands/notify-flush.js +47 -0
- package/dist/commands/notify-flush.js.map +1 -0
- package/dist/commands/orr.d.ts +3 -3
- package/dist/commands/orr.js +5 -5
- package/dist/commands/receipt-serve.d.ts +1 -1
- package/dist/commands/receipt-serve.js +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/commands/serve-mcp.js +1 -1
- package/dist/commands/start.d.ts +2 -2
- package/dist/commands/start.js +20 -20
- package/dist/commands/stop.d.ts +1 -1
- package/dist/commands/stop.js +6 -6
- package/dist/commands/update.d.ts +19 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +96 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/wire-hooks.d.ts +1 -1
- package/dist/commands/wire-hooks.js +14 -14
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/commands/wrap.js +12 -7
- package/dist/commands/wrap.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.js +5 -5
- package/dist/dash/dash.d.ts +1 -1
- package/dist/dash/dash.js +3 -3
- package/dist/dash/entitlement.d.ts +1 -1
- package/dist/dash/entitlement.js +1 -1
- package/dist/dash/render.js +2 -2
- package/dist/dash/screens/enterprise.js +9 -9
- package/dist/dash/screens/free.js +5 -5
- package/dist/diff-preview.d.ts +1 -1
- package/dist/diff-preview.js +2 -2
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/fs-atomic.d.ts +1 -1
- package/dist/fs-atomic.js +2 -2
- package/dist/gate/binary.js +4 -4
- package/dist/gate/config-gen.d.ts +1 -1
- package/dist/gate/config-gen.js +7 -7
- package/dist/gate/config.d.ts +2 -2
- package/dist/gate/config.js +6 -6
- package/dist/gate/daemon.js +1 -1
- package/dist/gate/discover.d.ts +2 -2
- package/dist/gate/discover.js +7 -7
- package/dist/gate/hosted-sync.js +1 -1
- package/dist/gate/otlp-decode.d.ts +2 -2
- package/dist/gate/otlp-decode.js +2 -2
- package/dist/gate/otlp-receiver.d.ts +1 -1
- package/dist/gate/otlp-receiver.js +3 -3
- package/dist/host-reload.js +11 -11
- package/dist/host-tools.d.ts +1 -1
- package/dist/host-tools.js +1 -1
- package/dist/importers/formats.d.ts +26 -0
- package/dist/importers/formats.d.ts.map +1 -0
- package/dist/importers/formats.js +281 -0
- package/dist/importers/formats.js.map +1 -0
- package/dist/importers/index.d.ts +26 -0
- package/dist/importers/index.d.ts.map +1 -0
- package/dist/importers/index.js +122 -0
- package/dist/importers/index.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/investigate/detectors.d.ts +35 -0
- package/dist/investigate/detectors.d.ts.map +1 -0
- package/dist/investigate/detectors.js +277 -0
- package/dist/investigate/detectors.js.map +1 -0
- package/dist/investigate/fix-brief.d.ts +3 -0
- package/dist/investigate/fix-brief.d.ts.map +1 -0
- package/dist/investigate/fix-brief.js +88 -0
- package/dist/investigate/fix-brief.js.map +1 -0
- package/dist/investigate/incidents.d.ts +19 -0
- package/dist/investigate/incidents.d.ts.map +1 -0
- package/dist/investigate/incidents.js +84 -0
- package/dist/investigate/incidents.js.map +1 -0
- package/dist/investigate/index.d.ts +25 -0
- package/dist/investigate/index.d.ts.map +1 -0
- package/dist/investigate/index.js +46 -0
- package/dist/investigate/index.js.map +1 -0
- package/dist/mcp/protocol.d.ts +2 -2
- package/dist/mcp/protocol.d.ts.map +1 -1
- package/dist/mcp/protocol.js +39 -8
- package/dist/mcp/protocol.js.map +1 -1
- package/dist/mcp/stdio.d.ts +1 -1
- package/dist/mcp/stdio.js +2 -2
- package/dist/mcp-servers.d.ts +2 -2
- package/dist/mcp-servers.js +2 -2
- package/dist/node-upgrade.d.ts +2 -2
- package/dist/node-upgrade.js +9 -9
- package/dist/notify/dispatch.d.ts +20 -0
- package/dist/notify/dispatch.d.ts.map +1 -0
- package/dist/notify/dispatch.js +52 -0
- package/dist/notify/dispatch.js.map +1 -0
- package/dist/notify/index.d.ts +39 -0
- package/dist/notify/index.d.ts.map +1 -0
- package/dist/notify/index.js +119 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/sender.d.ts +56 -0
- package/dist/notify/sender.d.ts.map +1 -0
- package/dist/notify/sender.js +139 -0
- package/dist/notify/sender.js.map +1 -0
- package/dist/notify/templates.d.ts +33 -0
- package/dist/notify/templates.d.ts.map +1 -0
- package/dist/notify/templates.js +119 -0
- package/dist/notify/templates.js.map +1 -0
- package/dist/offline-evaluate.d.ts +2 -2
- package/dist/offline-evaluate.js +3 -3
- package/dist/orr/agentshield.d.ts +2 -2
- package/dist/orr/agentshield.js +4 -4
- package/dist/orr/scorecard.d.ts +1 -1
- package/dist/orr/scorecard.js +3 -3
- package/dist/otel/exporter.d.ts +64 -0
- package/dist/otel/exporter.d.ts.map +1 -0
- package/dist/otel/exporter.js +243 -0
- package/dist/otel/exporter.js.map +1 -0
- package/dist/parse-args.d.ts +1 -1
- package/dist/parse-args.js +1 -1
- package/dist/receipt/auto-open.d.ts +1 -1
- package/dist/receipt/auto-open.js +1 -1
- package/dist/receipt/daemon.d.ts +6 -6
- package/dist/receipt/daemon.js +15 -15
- package/dist/receipt/dashboard.d.ts +1 -1
- package/dist/receipt/dashboard.js +2 -2
- package/dist/receipt/embeddings.d.ts +15 -4
- package/dist/receipt/embeddings.d.ts.map +1 -1
- package/dist/receipt/embeddings.js +116 -35
- package/dist/receipt/embeddings.js.map +1 -1
- package/dist/receipt/enrich.d.ts +2 -2
- package/dist/receipt/enrich.js +5 -5
- package/dist/receipt/gate-card.d.ts +2 -2
- package/dist/receipt/gate-card.d.ts.map +1 -1
- package/dist/receipt/gate-card.js +3 -3
- package/dist/receipt/live-server.d.ts.map +1 -1
- package/dist/receipt/live-server.js +22 -8
- package/dist/receipt/live-server.js.map +1 -1
- package/dist/receipt/receipt-css.d.ts +1 -1
- package/dist/receipt/receipt-css.d.ts.map +1 -1
- package/dist/receipt/receipt-css.js +72 -11
- package/dist/receipt/receipt-css.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +1 -1
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +138 -87
- package/dist/receipt/render-receipt.js.map +1 -1
- package/dist/receipt/share.d.ts +21 -2
- package/dist/receipt/share.d.ts.map +1 -1
- package/dist/receipt/share.js +68 -5
- package/dist/receipt/share.js.map +1 -1
- package/dist/sample-tools.d.ts +1 -1
- package/dist/sample-tools.js +1 -1
- package/dist/sandbox/mock-driver.d.ts +1 -1
- package/dist/sandbox/mock-driver.js +1 -1
- package/dist/sdk/a2a.d.ts +2 -2
- package/dist/sdk/a2a.js +1 -1
- package/dist/sdk/adapters/claude-agent.d.ts +1 -1
- package/dist/sdk/adapters/claude-agent.js +1 -1
- package/dist/sdk/adapters/langgraph.d.ts +1 -1
- package/dist/sdk/adapters/langgraph.js +1 -1
- package/dist/sdk/adapters/mastra.d.ts +1 -1
- package/dist/sdk/adapters/mastra.js +1 -1
- package/dist/sdk/adapters/openai-agents.d.ts +1 -1
- package/dist/sdk/adapters/openai-agents.js +1 -1
- package/dist/sdk/adapters/vercel-ai.d.ts +2 -2
- package/dist/sdk/adapters/vercel-ai.js +1 -1
- package/dist/sdk/govern.d.ts +2 -2
- package/dist/sdk/govern.js +3 -3
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js +1 -1
- package/dist/showback/trail-usage.d.ts +30 -0
- package/dist/showback/trail-usage.d.ts.map +1 -0
- package/dist/showback/trail-usage.js +50 -0
- package/dist/showback/trail-usage.js.map +1 -0
- package/dist/sign/evidence-bundle.d.ts +6 -6
- package/dist/sign/evidence-bundle.js +5 -5
- package/dist/star-cta.d.ts +1 -1
- package/dist/star-cta.d.ts.map +1 -1
- package/dist/star-cta.js +3 -3
- 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/dist/trail-summary.d.ts +1 -1
- package/dist/trail-summary.js +3 -3
- package/dist/trail.d.ts +8 -2
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +18 -5
- package/dist/trail.js.map +1 -1
- package/dist/update-check.d.ts +17 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +134 -0
- package/dist/update-check.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 +4 -3
- package/qwen/settings.example.json +1 -1
- 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/dist/trail-summary.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Strip query/fragment from URLs before they enter the summary. */
|
|
2
2
|
export declare function scrubUrl(value: string): string;
|
|
3
3
|
/**
|
|
4
|
-
* Shell lines: keep bin + arg count only
|
|
4
|
+
* Shell lines: keep bin + arg count only - never the full command
|
|
5
5
|
* (env assignments, -p passwords, Basic auth headers).
|
|
6
6
|
*/
|
|
7
7
|
export declare function summarizeShellCommand(cmd: string): string;
|
package/dist/trail-summary.js
CHANGED
|
@@ -124,14 +124,14 @@ export function scrubUrl(value) {
|
|
|
124
124
|
return value.replace(/([?&#][^=\s]*=)[^&\s#]+/g, "$1[redacted]");
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
127
|
-
* Shell lines: keep bin + arg count only
|
|
127
|
+
* Shell lines: keep bin + arg count only - never the full command
|
|
128
128
|
* (env assignments, -p passwords, Basic auth headers).
|
|
129
129
|
*/
|
|
130
130
|
export function summarizeShellCommand(cmd) {
|
|
131
131
|
const trimmed = cmd.trim();
|
|
132
132
|
if (!trimmed)
|
|
133
133
|
return "shell";
|
|
134
|
-
// Space-free URL masquerading as a "command"
|
|
134
|
+
// Space-free URL masquerading as a "command" - scrub query before binning.
|
|
135
135
|
if (!/\s/.test(trimmed) && (/^[a-z][a-z0-9+.-]*:/i.test(trimmed) || /[?&#].*=/.test(trimmed))) {
|
|
136
136
|
return finalize([`shell`, pathLike(trimmed)]) ?? "shell";
|
|
137
137
|
}
|
|
@@ -223,7 +223,7 @@ export function deriveTrailSummary(toolId, args) {
|
|
|
223
223
|
return undefined;
|
|
224
224
|
}
|
|
225
225
|
if (typeof args === "string") {
|
|
226
|
-
// Treat bare strings as opaque
|
|
226
|
+
// Treat bare strings as opaque - only length, avoid dumping secrets.
|
|
227
227
|
return finalize([verb || "args", `(${args.length} chars)`]);
|
|
228
228
|
}
|
|
229
229
|
if (typeof args === "number" || typeof args === "boolean") {
|
package/dist/trail.d.ts
CHANGED
|
@@ -20,11 +20,17 @@ export interface TrailEvent {
|
|
|
20
20
|
readonly diffPreview?: string;
|
|
21
21
|
/** Clipped redacted target file path (never raw args). */
|
|
22
22
|
readonly targetPath?: string;
|
|
23
|
+
/** Wall latency of the evaluate call in ms. Observe-only; never a verdict input. */
|
|
24
|
+
readonly latencyMs?: number;
|
|
25
|
+
/** Real input tokens reported by the host. Observe-only showback. */
|
|
26
|
+
readonly tokensIn?: number;
|
|
27
|
+
/** Real output tokens reported by the host. Observe-only showback. */
|
|
28
|
+
readonly tokensOut?: number;
|
|
23
29
|
}
|
|
24
30
|
export declare function globalTrailPath(env?: NodeJS.ProcessEnv): string;
|
|
25
31
|
/** Pre-0.3.0 per-project trail location, still merged on read. */
|
|
26
32
|
export declare function legacyTrailPath(cwd: string): string;
|
|
27
|
-
/** The trail is global since 0.3.0
|
|
33
|
+
/** The trail is global since 0.3.0 - one file for all projects. */
|
|
28
34
|
export declare function trailPath(_cwd: string, env?: NodeJS.ProcessEnv): string;
|
|
29
35
|
export declare function receiptsDir(cwd: string): string;
|
|
30
36
|
/** Detect Cursor / Claude Code / Codex / Grok / host from env. */
|
|
@@ -33,7 +39,7 @@ export declare function productLabel(p: TrailProduct | undefined): string;
|
|
|
33
39
|
/** Map a hook --host id to the trail product (explicit beats env sniffing). */
|
|
34
40
|
export declare function hostToProduct(host: string): TrailProduct;
|
|
35
41
|
export declare function appendTrail(cwd: string, event: TrailEvent, env?: NodeJS.ProcessEnv): void;
|
|
36
|
-
/** trail.jsonl read cap
|
|
42
|
+
/** trail.jsonl read cap - oversized files are tail-read (recent events win). */
|
|
37
43
|
export declare const MAX_TRAIL_BYTES: number;
|
|
38
44
|
/**
|
|
39
45
|
* Global trail + legacy per-cwd trail (pre-0.3.0 installs), merged and sorted
|
package/dist/trail.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trail.d.ts","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,GACL,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"trail.d.ts","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,GACL,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE5E;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEpF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAC3B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CAed;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,CAmBhE;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAexD;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,IAAI,CAQN;AAoED,gFAAgF;AAChF,eAAO,MAAM,eAAe,QAAc,CAAC;AAqC3C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,EAAE,CAazF;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,IAAI,EACX,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,UAAU,EAAE,CAOd;AAED,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAO7E"}
|
package/dist/trail.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Local session trail (JSONL). Observe path
|
|
2
|
+
* Local session trail (JSONL). Observe path - not a second PEP.
|
|
3
3
|
*/
|
|
4
4
|
import { appendFileSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, readSync, statSync, } from "node:fs";
|
|
5
5
|
import { basename, join } from "node:path";
|
|
@@ -11,7 +11,7 @@ export function globalTrailPath(env = process.env) {
|
|
|
11
11
|
export function legacyTrailPath(cwd) {
|
|
12
12
|
return join(configDir(cwd), "trail.jsonl");
|
|
13
13
|
}
|
|
14
|
-
/** The trail is global since 0.3.0
|
|
14
|
+
/** The trail is global since 0.3.0 - one file for all projects. */
|
|
15
15
|
export function trailPath(_cwd, env = process.env) {
|
|
16
16
|
return globalTrailPath(env);
|
|
17
17
|
}
|
|
@@ -97,7 +97,7 @@ const TRAIL_PRODUCTS = new Set([
|
|
|
97
97
|
]);
|
|
98
98
|
/**
|
|
99
99
|
* Validate one parsed JSONL line against the TrailEvent shape. Untrusted
|
|
100
|
-
* fields (wrong type, unknown mode/product) drop the line or the field
|
|
100
|
+
* fields (wrong type, unknown mode/product) drop the line or the field -
|
|
101
101
|
* a single malformed line must never brick the report render.
|
|
102
102
|
*/
|
|
103
103
|
function parseTrailEvent(raw) {
|
|
@@ -131,9 +131,22 @@ function parseTrailEvent(raw) {
|
|
|
131
131
|
...(typeof e.summary === "string" ? { summary: e.summary } : {}),
|
|
132
132
|
...(typeof e.diffPreview === "string" ? { diffPreview: e.diffPreview } : {}),
|
|
133
133
|
...(typeof e.targetPath === "string" ? { targetPath: e.targetPath } : {}),
|
|
134
|
+
...(nonNegNumber(e.latencyMs) !== undefined
|
|
135
|
+
? { latencyMs: nonNegNumber(e.latencyMs) }
|
|
136
|
+
: {}),
|
|
137
|
+
...(nonNegNumber(e.tokensIn) !== undefined
|
|
138
|
+
? { tokensIn: nonNegNumber(e.tokensIn) }
|
|
139
|
+
: {}),
|
|
140
|
+
...(nonNegNumber(e.tokensOut) !== undefined
|
|
141
|
+
? { tokensOut: nonNegNumber(e.tokensOut) }
|
|
142
|
+
: {}),
|
|
134
143
|
};
|
|
135
144
|
}
|
|
136
|
-
/**
|
|
145
|
+
/** Usage/latency fields pass only as finite non-negative numbers. */
|
|
146
|
+
function nonNegNumber(v) {
|
|
147
|
+
return typeof v === "number" && Number.isFinite(v) && v >= 0 ? v : undefined;
|
|
148
|
+
}
|
|
149
|
+
/** trail.jsonl read cap - oversized files are tail-read (recent events win). */
|
|
137
150
|
export const MAX_TRAIL_BYTES = 1024 * 1024;
|
|
138
151
|
function readTrailText(path) {
|
|
139
152
|
const size = statSync(path).size;
|
|
@@ -151,7 +164,7 @@ function readTrailText(path) {
|
|
|
151
164
|
finally {
|
|
152
165
|
closeSync(fd);
|
|
153
166
|
}
|
|
154
|
-
// First line is partial (possibly mid-multibyte)
|
|
167
|
+
// First line is partial (possibly mid-multibyte) - drop it.
|
|
155
168
|
const nl = tail.indexOf("\n");
|
|
156
169
|
return nl === -1 ? "" : tail.slice(nl + 1);
|
|
157
170
|
}
|
package/dist/trail.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trail.js","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"trail.js","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface UpdateCheckResult {
|
|
2
|
+
readonly current: string;
|
|
3
|
+
readonly latest: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function shouldSkipUpdateCheck(command: string | undefined, flags: Readonly<Record<string, string | boolean>>, env: NodeJS.ProcessEnv): boolean;
|
|
6
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
7
|
+
export interface UpdateCheckDeps {
|
|
8
|
+
readonly fetch?: typeof fetch;
|
|
9
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Returns { current, latest } when a newer version is available on npm,
|
|
13
|
+
* undefined when already up-to-date, offline, or the check failed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkForUpdate(deps?: UpdateCheckDeps): Promise<UpdateCheckResult | undefined>;
|
|
16
|
+
export declare function formatUpdateBanner(result: UpdateCheckResult): string;
|
|
17
|
+
//# sourceMappingURL=update-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAmBD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EACjD,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAQT;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AA6DD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAcvG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAEpE"}
|