@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.
Files changed (252) hide show
  1. package/.mcp.json +1 -1
  2. package/LIMITATIONS.md +1 -0
  3. package/README.md +90 -31
  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/certify/attest.js +5 -5
  9. package/dist/certify/catalog.d.ts +1 -1
  10. package/dist/certify/catalog.js +3 -3
  11. package/dist/certify/context.js +1 -1
  12. package/dist/certify/evaluate.d.ts +2 -2
  13. package/dist/certify/evaluate.js +12 -12
  14. package/dist/certify/live.js +2 -2
  15. package/dist/certify/render.d.ts +1 -1
  16. package/dist/certify/render.js +10 -10
  17. package/dist/cli.d.ts +4 -2
  18. package/dist/cli.d.ts.map +1 -1
  19. package/dist/cli.js +110 -37
  20. package/dist/cli.js.map +1 -1
  21. package/dist/commands/certify.d.ts +1 -1
  22. package/dist/commands/certify.js +3 -3
  23. package/dist/commands/connect.d.ts +2 -2
  24. package/dist/commands/connect.js +22 -22
  25. package/dist/commands/dash.js +4 -4
  26. package/dist/commands/gate-serve.d.ts.map +1 -1
  27. package/dist/commands/gate-serve.js +19 -5
  28. package/dist/commands/gate-serve.js.map +1 -1
  29. package/dist/commands/gate.d.ts +1 -1
  30. package/dist/commands/gate.js +16 -16
  31. package/dist/commands/hook.d.ts +1 -1
  32. package/dist/commands/hook.d.ts.map +1 -1
  33. package/dist/commands/hook.js +55 -18
  34. package/dist/commands/hook.js.map +1 -1
  35. package/dist/commands/import-traces.d.ts +16 -0
  36. package/dist/commands/import-traces.d.ts.map +1 -0
  37. package/dist/commands/import-traces.js +18 -0
  38. package/dist/commands/import-traces.js.map +1 -0
  39. package/dist/commands/init.js +1 -1
  40. package/dist/commands/investigate.d.ts +13 -0
  41. package/dist/commands/investigate.d.ts.map +1 -0
  42. package/dist/commands/investigate.js +22 -0
  43. package/dist/commands/investigate.js.map +1 -0
  44. package/dist/commands/notify-flush.d.ts +2 -0
  45. package/dist/commands/notify-flush.d.ts.map +1 -0
  46. package/dist/commands/notify-flush.js +47 -0
  47. package/dist/commands/notify-flush.js.map +1 -0
  48. package/dist/commands/orr.d.ts +3 -3
  49. package/dist/commands/orr.js +5 -5
  50. package/dist/commands/receipt-serve.d.ts +1 -1
  51. package/dist/commands/receipt-serve.js +1 -1
  52. package/dist/commands/receipt.d.ts +5 -2
  53. package/dist/commands/receipt.d.ts.map +1 -1
  54. package/dist/commands/receipt.js +7 -4
  55. package/dist/commands/receipt.js.map +1 -1
  56. package/dist/commands/serve-mcp.js +1 -1
  57. package/dist/commands/start.d.ts +2 -2
  58. package/dist/commands/start.js +20 -20
  59. package/dist/commands/stop.d.ts +1 -1
  60. package/dist/commands/stop.js +6 -6
  61. package/dist/commands/update.d.ts +19 -0
  62. package/dist/commands/update.d.ts.map +1 -0
  63. package/dist/commands/update.js +96 -0
  64. package/dist/commands/update.js.map +1 -0
  65. package/dist/commands/wire-hooks.d.ts +1 -1
  66. package/dist/commands/wire-hooks.js +14 -14
  67. package/dist/commands/wrap.d.ts.map +1 -1
  68. package/dist/commands/wrap.js +12 -7
  69. package/dist/commands/wrap.js.map +1 -1
  70. package/dist/config.d.ts +4 -4
  71. package/dist/config.js +5 -5
  72. package/dist/dash/dash.d.ts +1 -1
  73. package/dist/dash/dash.js +3 -3
  74. package/dist/dash/entitlement.d.ts +1 -1
  75. package/dist/dash/entitlement.js +1 -1
  76. package/dist/dash/render.js +2 -2
  77. package/dist/dash/screens/enterprise.js +9 -9
  78. package/dist/dash/screens/free.js +5 -5
  79. package/dist/diff-preview.d.ts +1 -1
  80. package/dist/diff-preview.js +2 -2
  81. package/dist/errors.d.ts +1 -1
  82. package/dist/errors.js +1 -1
  83. package/dist/fs-atomic.d.ts +1 -1
  84. package/dist/fs-atomic.js +2 -2
  85. package/dist/gate/binary.js +4 -4
  86. package/dist/gate/config-gen.d.ts +1 -1
  87. package/dist/gate/config-gen.js +7 -7
  88. package/dist/gate/config.d.ts +2 -2
  89. package/dist/gate/config.js +6 -6
  90. package/dist/gate/daemon.js +1 -1
  91. package/dist/gate/discover.d.ts +2 -2
  92. package/dist/gate/discover.js +7 -7
  93. package/dist/gate/hosted-sync.js +1 -1
  94. package/dist/gate/otlp-decode.d.ts +2 -2
  95. package/dist/gate/otlp-decode.js +2 -2
  96. package/dist/gate/otlp-receiver.d.ts +1 -1
  97. package/dist/gate/otlp-receiver.js +3 -3
  98. package/dist/host-reload.js +11 -11
  99. package/dist/host-tools.d.ts +1 -1
  100. package/dist/host-tools.js +1 -1
  101. package/dist/importers/formats.d.ts +26 -0
  102. package/dist/importers/formats.d.ts.map +1 -0
  103. package/dist/importers/formats.js +281 -0
  104. package/dist/importers/formats.js.map +1 -0
  105. package/dist/importers/index.d.ts +26 -0
  106. package/dist/importers/index.d.ts.map +1 -0
  107. package/dist/importers/index.js +122 -0
  108. package/dist/importers/index.js.map +1 -0
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.js +1 -1
  111. package/dist/investigate/detectors.d.ts +35 -0
  112. package/dist/investigate/detectors.d.ts.map +1 -0
  113. package/dist/investigate/detectors.js +277 -0
  114. package/dist/investigate/detectors.js.map +1 -0
  115. package/dist/investigate/fix-brief.d.ts +3 -0
  116. package/dist/investigate/fix-brief.d.ts.map +1 -0
  117. package/dist/investigate/fix-brief.js +88 -0
  118. package/dist/investigate/fix-brief.js.map +1 -0
  119. package/dist/investigate/incidents.d.ts +19 -0
  120. package/dist/investigate/incidents.d.ts.map +1 -0
  121. package/dist/investigate/incidents.js +84 -0
  122. package/dist/investigate/incidents.js.map +1 -0
  123. package/dist/investigate/index.d.ts +25 -0
  124. package/dist/investigate/index.d.ts.map +1 -0
  125. package/dist/investigate/index.js +46 -0
  126. package/dist/investigate/index.js.map +1 -0
  127. package/dist/mcp/protocol.d.ts +2 -2
  128. package/dist/mcp/protocol.d.ts.map +1 -1
  129. package/dist/mcp/protocol.js +39 -8
  130. package/dist/mcp/protocol.js.map +1 -1
  131. package/dist/mcp/stdio.d.ts +1 -1
  132. package/dist/mcp/stdio.js +2 -2
  133. package/dist/mcp-servers.d.ts +2 -2
  134. package/dist/mcp-servers.js +2 -2
  135. package/dist/node-upgrade.d.ts +2 -2
  136. package/dist/node-upgrade.js +9 -9
  137. package/dist/notify/dispatch.d.ts +20 -0
  138. package/dist/notify/dispatch.d.ts.map +1 -0
  139. package/dist/notify/dispatch.js +52 -0
  140. package/dist/notify/dispatch.js.map +1 -0
  141. package/dist/notify/index.d.ts +39 -0
  142. package/dist/notify/index.d.ts.map +1 -0
  143. package/dist/notify/index.js +119 -0
  144. package/dist/notify/index.js.map +1 -0
  145. package/dist/notify/sender.d.ts +56 -0
  146. package/dist/notify/sender.d.ts.map +1 -0
  147. package/dist/notify/sender.js +139 -0
  148. package/dist/notify/sender.js.map +1 -0
  149. package/dist/notify/templates.d.ts +33 -0
  150. package/dist/notify/templates.d.ts.map +1 -0
  151. package/dist/notify/templates.js +119 -0
  152. package/dist/notify/templates.js.map +1 -0
  153. package/dist/offline-evaluate.d.ts +2 -2
  154. package/dist/offline-evaluate.js +3 -3
  155. package/dist/orr/agentshield.d.ts +2 -2
  156. package/dist/orr/agentshield.js +4 -4
  157. package/dist/orr/scorecard.d.ts +1 -1
  158. package/dist/orr/scorecard.js +3 -3
  159. package/dist/otel/exporter.d.ts +64 -0
  160. package/dist/otel/exporter.d.ts.map +1 -0
  161. package/dist/otel/exporter.js +243 -0
  162. package/dist/otel/exporter.js.map +1 -0
  163. package/dist/parse-args.d.ts +1 -1
  164. package/dist/parse-args.js +1 -1
  165. package/dist/receipt/auto-open.d.ts +1 -1
  166. package/dist/receipt/auto-open.js +1 -1
  167. package/dist/receipt/daemon.d.ts +6 -6
  168. package/dist/receipt/daemon.js +15 -15
  169. package/dist/receipt/dashboard.d.ts +1 -1
  170. package/dist/receipt/dashboard.js +2 -2
  171. package/dist/receipt/embeddings.d.ts +15 -4
  172. package/dist/receipt/embeddings.d.ts.map +1 -1
  173. package/dist/receipt/embeddings.js +116 -35
  174. package/dist/receipt/embeddings.js.map +1 -1
  175. package/dist/receipt/enrich.d.ts +2 -2
  176. package/dist/receipt/enrich.js +5 -5
  177. package/dist/receipt/gate-card.d.ts +2 -2
  178. package/dist/receipt/gate-card.d.ts.map +1 -1
  179. package/dist/receipt/gate-card.js +3 -3
  180. package/dist/receipt/live-server.d.ts.map +1 -1
  181. package/dist/receipt/live-server.js +22 -8
  182. package/dist/receipt/live-server.js.map +1 -1
  183. package/dist/receipt/receipt-css.d.ts +1 -1
  184. package/dist/receipt/receipt-css.d.ts.map +1 -1
  185. package/dist/receipt/receipt-css.js +72 -11
  186. package/dist/receipt/receipt-css.js.map +1 -1
  187. package/dist/receipt/render-receipt.d.ts +1 -1
  188. package/dist/receipt/render-receipt.d.ts.map +1 -1
  189. package/dist/receipt/render-receipt.js +138 -87
  190. package/dist/receipt/render-receipt.js.map +1 -1
  191. package/dist/receipt/share.d.ts +21 -2
  192. package/dist/receipt/share.d.ts.map +1 -1
  193. package/dist/receipt/share.js +68 -5
  194. package/dist/receipt/share.js.map +1 -1
  195. package/dist/sample-tools.d.ts +1 -1
  196. package/dist/sample-tools.js +1 -1
  197. package/dist/sandbox/mock-driver.d.ts +1 -1
  198. package/dist/sandbox/mock-driver.js +1 -1
  199. package/dist/sdk/a2a.d.ts +2 -2
  200. package/dist/sdk/a2a.js +1 -1
  201. package/dist/sdk/adapters/claude-agent.d.ts +1 -1
  202. package/dist/sdk/adapters/claude-agent.js +1 -1
  203. package/dist/sdk/adapters/langgraph.d.ts +1 -1
  204. package/dist/sdk/adapters/langgraph.js +1 -1
  205. package/dist/sdk/adapters/mastra.d.ts +1 -1
  206. package/dist/sdk/adapters/mastra.js +1 -1
  207. package/dist/sdk/adapters/openai-agents.d.ts +1 -1
  208. package/dist/sdk/adapters/openai-agents.js +1 -1
  209. package/dist/sdk/adapters/vercel-ai.d.ts +2 -2
  210. package/dist/sdk/adapters/vercel-ai.js +1 -1
  211. package/dist/sdk/govern.d.ts +2 -2
  212. package/dist/sdk/govern.js +3 -3
  213. package/dist/sdk/index.d.ts +1 -1
  214. package/dist/sdk/index.js +1 -1
  215. package/dist/showback/trail-usage.d.ts +30 -0
  216. package/dist/showback/trail-usage.d.ts.map +1 -0
  217. package/dist/showback/trail-usage.js +50 -0
  218. package/dist/showback/trail-usage.js.map +1 -0
  219. package/dist/sign/evidence-bundle.d.ts +6 -6
  220. package/dist/sign/evidence-bundle.js +5 -5
  221. package/dist/star-cta.d.ts +1 -1
  222. package/dist/star-cta.d.ts.map +1 -1
  223. package/dist/star-cta.js +3 -3
  224. package/dist/telemetry.d.ts +135 -0
  225. package/dist/telemetry.d.ts.map +1 -0
  226. package/dist/telemetry.js +427 -0
  227. package/dist/telemetry.js.map +1 -0
  228. package/dist/trail-summary.d.ts +1 -1
  229. package/dist/trail-summary.js +3 -3
  230. package/dist/trail.d.ts +8 -2
  231. package/dist/trail.d.ts.map +1 -1
  232. package/dist/trail.js +18 -5
  233. package/dist/trail.js.map +1 -1
  234. package/dist/update-check.d.ts +17 -0
  235. package/dist/update-check.d.ts.map +1 -0
  236. package/dist/update-check.js +134 -0
  237. package/dist/update-check.js.map +1 -0
  238. package/droid/README.md +1 -1
  239. package/droid/mcp.example.json +1 -1
  240. package/gemini/settings.example.json +1 -1
  241. package/grok/README.md +1 -1
  242. package/kilo/kilo.example.json +1 -1
  243. package/kimi/mcp.example.json +1 -1
  244. package/kiro/mcp.example.json +1 -1
  245. package/manifest.json +1 -1
  246. package/mastracode/mcp.example.json +1 -1
  247. package/mcp.json +1 -1
  248. package/openai/codex.config.example.toml +1 -1
  249. package/opencode/opencode.example.json +1 -1
  250. package/package.json +4 -3
  251. package/qwen/settings.example.json +1 -1
  252. 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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"}
@@ -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 — never the full command
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;
@@ -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 — never the full command
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" — scrub query before binning.
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 — only length, avoid dumping secrets.
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 — one file for all projects. */
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 — oversized files are tail-read (recent events win). */
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
@@ -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;CAC9B;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;AAsDD,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"}
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 — not a second PEP.
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 — one file for all projects. */
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
- /** trail.jsonl read cap — oversized files are tail-read (recent events win). */
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) — drop it.
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":"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"}
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"}