@shield-agent/kya 0.22.0 → 0.23.1

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 (243) hide show
  1. package/.mcp.json +1 -1
  2. package/README.md +72 -30
  3. package/amp/settings.example.json +1 -1
  4. package/claude/claude_desktop_config.example.json +1 -1
  5. package/cline/cline_mcp_settings.example.json +1 -1
  6. package/copilot/mcp-config.example.json +1 -1
  7. package/dist/certify/attest.js +5 -5
  8. package/dist/certify/catalog.d.ts +1 -1
  9. package/dist/certify/catalog.js +3 -3
  10. package/dist/certify/context.js +1 -1
  11. package/dist/certify/evaluate.d.ts +2 -2
  12. package/dist/certify/evaluate.js +12 -12
  13. package/dist/certify/live.js +2 -2
  14. package/dist/certify/render.d.ts +1 -1
  15. package/dist/certify/render.js +10 -10
  16. package/dist/cli.d.ts +2 -2
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +49 -16
  19. package/dist/cli.js.map +1 -1
  20. package/dist/commands/certify.d.ts +1 -1
  21. package/dist/commands/certify.js +3 -3
  22. package/dist/commands/connect.d.ts +2 -2
  23. package/dist/commands/connect.js +22 -22
  24. package/dist/commands/dash.js +4 -4
  25. package/dist/commands/gate-serve.js +3 -3
  26. package/dist/commands/gate.d.ts +1 -1
  27. package/dist/commands/gate.js +16 -16
  28. package/dist/commands/hook.d.ts +1 -1
  29. package/dist/commands/hook.d.ts.map +1 -1
  30. package/dist/commands/hook.js +55 -18
  31. package/dist/commands/hook.js.map +1 -1
  32. package/dist/commands/import-traces.d.ts +16 -0
  33. package/dist/commands/import-traces.d.ts.map +1 -0
  34. package/dist/commands/import-traces.js +18 -0
  35. package/dist/commands/import-traces.js.map +1 -0
  36. package/dist/commands/init.js +1 -1
  37. package/dist/commands/investigate.d.ts +13 -0
  38. package/dist/commands/investigate.d.ts.map +1 -0
  39. package/dist/commands/investigate.js +22 -0
  40. package/dist/commands/investigate.js.map +1 -0
  41. package/dist/commands/notify-flush.d.ts +2 -0
  42. package/dist/commands/notify-flush.d.ts.map +1 -0
  43. package/dist/commands/notify-flush.js +47 -0
  44. package/dist/commands/notify-flush.js.map +1 -0
  45. package/dist/commands/orr.d.ts +3 -3
  46. package/dist/commands/orr.js +5 -5
  47. package/dist/commands/receipt-serve.d.ts +1 -1
  48. package/dist/commands/receipt-serve.js +1 -1
  49. package/dist/commands/serve-mcp.js +1 -1
  50. package/dist/commands/start.d.ts +2 -2
  51. package/dist/commands/start.js +20 -20
  52. package/dist/commands/stop.d.ts +1 -1
  53. package/dist/commands/stop.js +6 -6
  54. package/dist/commands/update.d.ts +19 -0
  55. package/dist/commands/update.d.ts.map +1 -0
  56. package/dist/commands/update.js +96 -0
  57. package/dist/commands/update.js.map +1 -0
  58. package/dist/commands/wire-hooks.d.ts +1 -1
  59. package/dist/commands/wire-hooks.js +14 -14
  60. package/dist/commands/wrap.d.ts.map +1 -1
  61. package/dist/commands/wrap.js +12 -7
  62. package/dist/commands/wrap.js.map +1 -1
  63. package/dist/config.d.ts +4 -4
  64. package/dist/config.js +5 -5
  65. package/dist/dash/dash.d.ts +1 -1
  66. package/dist/dash/dash.js +3 -3
  67. package/dist/dash/entitlement.d.ts +1 -1
  68. package/dist/dash/entitlement.js +1 -1
  69. package/dist/dash/render.js +2 -2
  70. package/dist/dash/screens/enterprise.js +9 -9
  71. package/dist/dash/screens/free.js +5 -5
  72. package/dist/diff-preview.d.ts +1 -1
  73. package/dist/diff-preview.js +2 -2
  74. package/dist/errors.d.ts +1 -1
  75. package/dist/errors.js +1 -1
  76. package/dist/fs-atomic.d.ts +1 -1
  77. package/dist/fs-atomic.js +2 -2
  78. package/dist/gate/binary.js +4 -4
  79. package/dist/gate/config-gen.d.ts +1 -1
  80. package/dist/gate/config-gen.js +7 -7
  81. package/dist/gate/config.d.ts +2 -2
  82. package/dist/gate/config.js +6 -6
  83. package/dist/gate/daemon.js +1 -1
  84. package/dist/gate/discover.d.ts +2 -2
  85. package/dist/gate/discover.js +7 -7
  86. package/dist/gate/hosted-sync.js +1 -1
  87. package/dist/gate/otlp-decode.d.ts +2 -2
  88. package/dist/gate/otlp-decode.js +2 -2
  89. package/dist/gate/otlp-receiver.d.ts +1 -1
  90. package/dist/gate/otlp-receiver.js +3 -3
  91. package/dist/host-reload.js +11 -11
  92. package/dist/host-tools.d.ts +1 -1
  93. package/dist/host-tools.js +1 -1
  94. package/dist/importers/formats.d.ts +26 -0
  95. package/dist/importers/formats.d.ts.map +1 -0
  96. package/dist/importers/formats.js +281 -0
  97. package/dist/importers/formats.js.map +1 -0
  98. package/dist/importers/index.d.ts +26 -0
  99. package/dist/importers/index.d.ts.map +1 -0
  100. package/dist/importers/index.js +122 -0
  101. package/dist/importers/index.js.map +1 -0
  102. package/dist/index.d.ts +1 -1
  103. package/dist/index.js +1 -1
  104. package/dist/investigate/detectors.d.ts +35 -0
  105. package/dist/investigate/detectors.d.ts.map +1 -0
  106. package/dist/investigate/detectors.js +277 -0
  107. package/dist/investigate/detectors.js.map +1 -0
  108. package/dist/investigate/fix-brief.d.ts +3 -0
  109. package/dist/investigate/fix-brief.d.ts.map +1 -0
  110. package/dist/investigate/fix-brief.js +88 -0
  111. package/dist/investigate/fix-brief.js.map +1 -0
  112. package/dist/investigate/incidents.d.ts +19 -0
  113. package/dist/investigate/incidents.d.ts.map +1 -0
  114. package/dist/investigate/incidents.js +84 -0
  115. package/dist/investigate/incidents.js.map +1 -0
  116. package/dist/investigate/index.d.ts +25 -0
  117. package/dist/investigate/index.d.ts.map +1 -0
  118. package/dist/investigate/index.js +46 -0
  119. package/dist/investigate/index.js.map +1 -0
  120. package/dist/mcp/protocol.d.ts +2 -2
  121. package/dist/mcp/protocol.d.ts.map +1 -1
  122. package/dist/mcp/protocol.js +39 -8
  123. package/dist/mcp/protocol.js.map +1 -1
  124. package/dist/mcp/stdio.d.ts +1 -1
  125. package/dist/mcp/stdio.js +2 -2
  126. package/dist/mcp-servers.d.ts +2 -2
  127. package/dist/mcp-servers.js +2 -2
  128. package/dist/node-upgrade.d.ts +2 -2
  129. package/dist/node-upgrade.js +9 -9
  130. package/dist/notify/dispatch.d.ts +20 -0
  131. package/dist/notify/dispatch.d.ts.map +1 -0
  132. package/dist/notify/dispatch.js +52 -0
  133. package/dist/notify/dispatch.js.map +1 -0
  134. package/dist/notify/index.d.ts +39 -0
  135. package/dist/notify/index.d.ts.map +1 -0
  136. package/dist/notify/index.js +119 -0
  137. package/dist/notify/index.js.map +1 -0
  138. package/dist/notify/sender.d.ts +56 -0
  139. package/dist/notify/sender.d.ts.map +1 -0
  140. package/dist/notify/sender.js +139 -0
  141. package/dist/notify/sender.js.map +1 -0
  142. package/dist/notify/templates.d.ts +33 -0
  143. package/dist/notify/templates.d.ts.map +1 -0
  144. package/dist/notify/templates.js +119 -0
  145. package/dist/notify/templates.js.map +1 -0
  146. package/dist/offline-evaluate.d.ts +2 -2
  147. package/dist/offline-evaluate.js +3 -3
  148. package/dist/orr/agentshield.d.ts +2 -2
  149. package/dist/orr/agentshield.js +4 -4
  150. package/dist/orr/scorecard.d.ts +1 -1
  151. package/dist/orr/scorecard.js +3 -3
  152. package/dist/otel/exporter.d.ts +64 -0
  153. package/dist/otel/exporter.d.ts.map +1 -0
  154. package/dist/otel/exporter.js +247 -0
  155. package/dist/otel/exporter.js.map +1 -0
  156. package/dist/parse-args.d.ts +1 -1
  157. package/dist/parse-args.js +1 -1
  158. package/dist/receipt/auto-open.d.ts +1 -1
  159. package/dist/receipt/auto-open.js +1 -1
  160. package/dist/receipt/daemon.d.ts +6 -6
  161. package/dist/receipt/daemon.js +15 -15
  162. package/dist/receipt/dashboard.d.ts +1 -1
  163. package/dist/receipt/dashboard.js +2 -2
  164. package/dist/receipt/embeddings.d.ts +15 -4
  165. package/dist/receipt/embeddings.d.ts.map +1 -1
  166. package/dist/receipt/embeddings.js +116 -35
  167. package/dist/receipt/embeddings.js.map +1 -1
  168. package/dist/receipt/enrich.d.ts +2 -2
  169. package/dist/receipt/enrich.js +5 -5
  170. package/dist/receipt/gate-card.d.ts +2 -2
  171. package/dist/receipt/gate-card.d.ts.map +1 -1
  172. package/dist/receipt/gate-card.js +3 -3
  173. package/dist/receipt/live-server.d.ts.map +1 -1
  174. package/dist/receipt/live-server.js +22 -8
  175. package/dist/receipt/live-server.js.map +1 -1
  176. package/dist/receipt/receipt-css.d.ts +1 -1
  177. package/dist/receipt/receipt-css.d.ts.map +1 -1
  178. package/dist/receipt/receipt-css.js +72 -11
  179. package/dist/receipt/receipt-css.js.map +1 -1
  180. package/dist/receipt/render-receipt.d.ts +1 -1
  181. package/dist/receipt/render-receipt.d.ts.map +1 -1
  182. package/dist/receipt/render-receipt.js +138 -87
  183. package/dist/receipt/render-receipt.js.map +1 -1
  184. package/dist/receipt/search.d.ts +11 -0
  185. package/dist/receipt/search.d.ts.map +1 -1
  186. package/dist/receipt/search.js +70 -3
  187. package/dist/receipt/search.js.map +1 -1
  188. package/dist/receipt/share.d.ts +2 -2
  189. package/dist/receipt/share.js +5 -5
  190. package/dist/sample-tools.d.ts +1 -1
  191. package/dist/sample-tools.js +1 -1
  192. package/dist/sandbox/mock-driver.d.ts +1 -1
  193. package/dist/sandbox/mock-driver.js +1 -1
  194. package/dist/sdk/a2a.d.ts +2 -2
  195. package/dist/sdk/a2a.js +1 -1
  196. package/dist/sdk/adapters/claude-agent.d.ts +1 -1
  197. package/dist/sdk/adapters/claude-agent.js +1 -1
  198. package/dist/sdk/adapters/langgraph.d.ts +1 -1
  199. package/dist/sdk/adapters/langgraph.js +1 -1
  200. package/dist/sdk/adapters/mastra.d.ts +1 -1
  201. package/dist/sdk/adapters/mastra.js +1 -1
  202. package/dist/sdk/adapters/openai-agents.d.ts +1 -1
  203. package/dist/sdk/adapters/openai-agents.js +1 -1
  204. package/dist/sdk/adapters/vercel-ai.d.ts +2 -2
  205. package/dist/sdk/adapters/vercel-ai.js +1 -1
  206. package/dist/sdk/govern.d.ts +2 -2
  207. package/dist/sdk/govern.js +3 -3
  208. package/dist/sdk/index.d.ts +1 -1
  209. package/dist/sdk/index.js +1 -1
  210. package/dist/showback/trail-usage.d.ts +30 -0
  211. package/dist/showback/trail-usage.d.ts.map +1 -0
  212. package/dist/showback/trail-usage.js +50 -0
  213. package/dist/showback/trail-usage.js.map +1 -0
  214. package/dist/sign/evidence-bundle.d.ts +6 -6
  215. package/dist/sign/evidence-bundle.js +5 -5
  216. package/dist/star-cta.d.ts +1 -1
  217. package/dist/star-cta.d.ts.map +1 -1
  218. package/dist/star-cta.js +3 -3
  219. package/dist/trail-summary.d.ts +1 -1
  220. package/dist/trail-summary.js +3 -3
  221. package/dist/trail.d.ts +8 -2
  222. package/dist/trail.d.ts.map +1 -1
  223. package/dist/trail.js +18 -5
  224. package/dist/trail.js.map +1 -1
  225. package/dist/update-check.d.ts +17 -0
  226. package/dist/update-check.d.ts.map +1 -0
  227. package/dist/update-check.js +134 -0
  228. package/dist/update-check.js.map +1 -0
  229. package/droid/README.md +1 -1
  230. package/droid/mcp.example.json +1 -1
  231. package/gemini/settings.example.json +1 -1
  232. package/grok/README.md +1 -1
  233. package/kilo/kilo.example.json +1 -1
  234. package/kimi/mcp.example.json +1 -1
  235. package/kiro/mcp.example.json +1 -1
  236. package/manifest.json +1 -1
  237. package/mastracode/mcp.example.json +1 -1
  238. package/mcp.json +1 -1
  239. package/openai/codex.config.example.toml +1 -1
  240. package/opencode/opencode.example.json +1 -1
  241. package/package.json +5 -3
  242. package/qwen/settings.example.json +1 -1
  243. package/server.json +2 -2
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Best-effort OTLP/HTTP export of KYA verdicts as GenAI spans. Opt-in:
3
+ * disabled unless an endpoint is configured (env KYA_OTLP_EXPORT_ENDPOINT or
4
+ * "otlpExport" in .kya/config.json). Fire-and-forget: export NEVER blocks,
5
+ * delays, or changes a verdict. Every failure is swallowed and counted
6
+ * in-memory for a future status surface.
7
+ *
8
+ * Privacy: only verdict metadata ships (tool id, verdict, reason code, mode,
9
+ * host, session id, token counts when known). Tool args, prompts, approval
10
+ * bodies, and API keys are never exported - same rule as docs/otlp.md.
11
+ *
12
+ * No new dependencies: one hand-built OTLP/JSON payload and the global fetch.
13
+ */
14
+ import { randomBytes } from "node:crypto";
15
+ import { CLI_VERSION } from "../version.js";
16
+ const EXPORT_TIMEOUT_MS = 2_000;
17
+ const SERVICE_NAME = "shield-kya-cli";
18
+ const SCOPE_NAME = "shield-kya-cli";
19
+ const stats = { attempted: 0, exported: 0, failed: 0 };
20
+ /** In-memory counters for a future status command; process-local only. */
21
+ export function otlpExportStats() {
22
+ return { ...stats };
23
+ }
24
+ /**
25
+ * Resolve export config from env > parsed .kya/config.json. Accepts the parsed
26
+ * config object so callers that already read the file (resolveConfig) need no
27
+ * config.ts change. Returns undefined when disabled (no endpoint anywhere).
28
+ */
29
+ export function resolveOtlpExportConfig(env = process.env, configJson) {
30
+ const file = readFileKey(configJson);
31
+ const endpoint = env.KYA_OTLP_EXPORT_ENDPOINT?.trim() || file?.endpoint;
32
+ if (!endpoint)
33
+ return undefined;
34
+ return {
35
+ endpoint,
36
+ ...(file?.headers ? { headers: file.headers } : {}),
37
+ insecure: file?.insecure === true,
38
+ };
39
+ }
40
+ function readFileKey(configJson) {
41
+ if (!configJson || typeof configJson !== "object" || Array.isArray(configJson)) {
42
+ return undefined;
43
+ }
44
+ const raw = configJson.otlpExport;
45
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
46
+ return undefined;
47
+ const key = raw;
48
+ const endpoint = typeof key.endpoint === "string" && key.endpoint.trim()
49
+ ? key.endpoint.trim()
50
+ : undefined;
51
+ if (!endpoint)
52
+ return undefined;
53
+ let headers;
54
+ if (key.headers && typeof key.headers === "object" && !Array.isArray(key.headers)) {
55
+ headers = {};
56
+ for (const [k, v] of Object.entries(key.headers)) {
57
+ if (typeof v === "string" && k.trim())
58
+ headers[k.trim()] = v;
59
+ }
60
+ if (Object.keys(headers).length === 0)
61
+ headers = undefined;
62
+ }
63
+ return {
64
+ endpoint,
65
+ ...(headers ? { headers } : {}),
66
+ insecure: key.insecure === true,
67
+ };
68
+ }
69
+ /** Loopback plaintext is fine; anything else over http requires insecure:true. */
70
+ function endpointAllowed(cfg) {
71
+ let url;
72
+ try {
73
+ url = new URL(cfg.endpoint);
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ if (url.protocol === "https:")
79
+ return true;
80
+ if (url.protocol !== "http:")
81
+ return false;
82
+ if (cfg.insecure === true)
83
+ return true;
84
+ const host = url.hostname.toLowerCase();
85
+ return host === "127.0.0.1" || host === "::1" || host === "localhost";
86
+ }
87
+ function tracesUrl(cfg) {
88
+ // No regex here: trailing-slash stripping with a loop keeps static
89
+ // analyzers (and reviewers) sure this is linear on uncontrolled input.
90
+ let base = cfg.endpoint;
91
+ while (base.endsWith("/"))
92
+ base = base.slice(0, -1);
93
+ return base.endsWith("/v1/traces") ? base : `${base}/v1/traces`;
94
+ }
95
+ function hex(bytes) {
96
+ return randomBytes(bytes).toString("hex");
97
+ }
98
+ function nano(ts) {
99
+ const ms = ts ? Date.parse(ts) : Number.NaN;
100
+ const base = Number.isFinite(ms) ? ms : Date.now();
101
+ return (BigInt(Math.floor(base)) * 1000000n).toString();
102
+ }
103
+ function attr(key, value) {
104
+ return { key, value };
105
+ }
106
+ function strAttr(key, value) {
107
+ if (typeof value !== "string" || !value)
108
+ return undefined;
109
+ return attr(key, { stringValue: value });
110
+ }
111
+ function intAttr(key, value) {
112
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
113
+ return undefined;
114
+ return attr(key, { intValue: String(Math.floor(value)) });
115
+ }
116
+ /** One OTLP/JSON ExportTraceServiceRequest carrying exactly one verdict span. */
117
+ export function buildVerdictTracePayload(event) {
118
+ const start = nano(event.ts);
119
+ const attributes = [
120
+ strAttr("gen_ai.tool.name", event.toolId),
121
+ strAttr("kya.verdict", event.verdict),
122
+ strAttr("kya.reason_code", event.reasonCode),
123
+ strAttr("kya.mode", event.mode),
124
+ strAttr("kya.host", event.host),
125
+ strAttr("kya.session_id", event.sessionId),
126
+ intAttr("gen_ai.usage.input_tokens", event.tokensIn),
127
+ intAttr("gen_ai.usage.output_tokens", event.tokensOut),
128
+ ].filter((a) => a !== undefined);
129
+ const denied = event.verdict === "DENY";
130
+ return {
131
+ resourceSpans: [
132
+ {
133
+ resource: {
134
+ attributes: [
135
+ attr("service.name", { stringValue: SERVICE_NAME }),
136
+ attr("service.version", { stringValue: CLI_VERSION }),
137
+ ],
138
+ },
139
+ scopeSpans: [
140
+ {
141
+ scope: { name: SCOPE_NAME, version: CLI_VERSION },
142
+ spans: [
143
+ {
144
+ traceId: hex(16),
145
+ spanId: hex(8),
146
+ name: `kya.verdict ${event.toolId}`,
147
+ // SPAN_KIND_INTERNAL: the verdict is a local policy decision.
148
+ kind: 1,
149
+ startTimeUnixNano: start,
150
+ endTimeUnixNano: start,
151
+ attributes,
152
+ status: denied
153
+ ? { code: 2, message: event.reasonCode || "DENY" }
154
+ : { code: 1 },
155
+ },
156
+ ],
157
+ },
158
+ ],
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ /**
164
+ * Export one verdict span. Never throws, never blocks the caller beyond the
165
+ * 2s timeout budget, and never touches the verdict itself. No-op when the
166
+ * config is undefined (unconfigured) or the endpoint fails the scheme check.
167
+ */
168
+ export async function exportVerdictSpan(event, config) {
169
+ if (!config || !endpointAllowed(config))
170
+ return;
171
+ stats.attempted += 1;
172
+ const controller = new AbortController();
173
+ const timer = setTimeout(() => controller.abort(), EXPORT_TIMEOUT_MS);
174
+ try {
175
+ const res = await fetch(tracesUrl(config), {
176
+ method: "POST",
177
+ headers: {
178
+ "content-type": "application/json",
179
+ ...(config.headers ?? {}),
180
+ },
181
+ body: JSON.stringify(buildVerdictTracePayload(event)),
182
+ signal: controller.signal,
183
+ });
184
+ // Drain so the socket is released back to the pool.
185
+ await res.arrayBuffer().catch(() => new ArrayBuffer(0));
186
+ if (res.ok)
187
+ stats.exported += 1;
188
+ else
189
+ stats.failed += 1;
190
+ }
191
+ catch {
192
+ stats.failed += 1;
193
+ }
194
+ finally {
195
+ clearTimeout(timer);
196
+ }
197
+ }
198
+ /**
199
+ * CLI-invocable self-test: POST one synthetic span and report the outcome.
200
+ * Unlike exportVerdictSpan it reports failure detail instead of only counting
201
+ * it - still never throws.
202
+ */
203
+ export async function otlpExportSelfTest(config) {
204
+ if (!config)
205
+ return { ok: false, detail: "otlpExport not configured (no endpoint)" };
206
+ if (!endpointAllowed(config)) {
207
+ return {
208
+ ok: false,
209
+ detail: `endpoint refused: non-https to a non-loopback host needs "insecure": true (${config.endpoint})`,
210
+ };
211
+ }
212
+ const event = {
213
+ ts: new Date().toISOString(),
214
+ sessionId: "otlp-selftest",
215
+ toolId: "kya__selftest",
216
+ verdict: "ALLOW",
217
+ reasonCode: "SELFTEST",
218
+ mode: "observe",
219
+ host: "ide",
220
+ };
221
+ const controller = new AbortController();
222
+ const timer = setTimeout(() => controller.abort(), EXPORT_TIMEOUT_MS);
223
+ try {
224
+ const res = await fetch(tracesUrl(config), {
225
+ method: "POST",
226
+ headers: {
227
+ "content-type": "application/json",
228
+ ...(config.headers ?? {}),
229
+ },
230
+ body: JSON.stringify(buildVerdictTracePayload(event)),
231
+ signal: controller.signal,
232
+ });
233
+ await res.arrayBuffer().catch(() => new ArrayBuffer(0));
234
+ if (res.ok) {
235
+ return { ok: true, detail: `span accepted (${res.status}) at ${tracesUrl(config)}` };
236
+ }
237
+ return { ok: false, detail: `endpoint returned HTTP ${res.status} at ${tracesUrl(config)}` };
238
+ }
239
+ catch (err) {
240
+ const msg = err instanceof Error ? err.message : String(err);
241
+ return { ok: false, detail: `export failed: ${msg}` };
242
+ }
243
+ finally {
244
+ clearTimeout(timer);
245
+ }
246
+ }
247
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../src/otel/exporter.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Minimal argv parser — no external CLI framework.
2
+ * Minimal argv parser - no external CLI framework.
3
3
  * Supports: flags (--foo), values (--foo bar | --foo=bar), boolean (--stdio), positionals.
4
4
  */
5
5
  export interface ParsedArgs {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Minimal argv parser — no external CLI framework.
2
+ * Minimal argv parser - no external CLI framework.
3
3
  * Supports: flags (--foo), values (--foo bar | --foo=bar), boolean (--stdio), positionals.
4
4
  */
5
5
  export function parseArgs(argv) {
@@ -7,7 +7,7 @@ export interface AutoOpenResult {
7
7
  }
8
8
  /**
9
9
  * Write the latest receipt and optionally open it in the browser.
10
- * @param force — open even if already opened this cwd (use on DENY).
10
+ * @param force - open even if already opened this cwd (use on DENY).
11
11
  */
12
12
  export declare function autoOpenReceiptAfterWrap(config: ResolvedConfig, opts?: {
13
13
  force?: boolean;
@@ -42,7 +42,7 @@ function openBrowser(target) {
42
42
  }
43
43
  /**
44
44
  * Write the latest receipt and optionally open it in the browser.
45
- * @param force — open even if already opened this cwd (use on DENY).
45
+ * @param force - open even if already opened this cwd (use on DENY).
46
46
  */
47
47
  export async function autoOpenReceiptAfterWrap(config, opts = {}) {
48
48
  const env = opts.env ?? process.env;
@@ -18,7 +18,7 @@ export declare function writeDaemonState(cwd: string, state: ReceiptDaemonState)
18
18
  /**
19
19
  * Remove the state file. With expectedPid set (daemon shutdown), removal is
20
20
  * skipped when the file was already replaced by a newer daemon (pid mismatch)
21
- * — a dying daemon must not delete its successor's state. Read errors /
21
+ * - a dying daemon must not delete its successor's state. Read errors /
22
22
  * missing / corrupt state still remove (we own the normal case).
23
23
  */
24
24
  export declare function clearDaemonState(cwd: string, expectedPid?: number): void;
@@ -45,13 +45,13 @@ export interface DaemonProc {
45
45
  */
46
46
  export declare function listOwnedProcesses(platform?: NodeJS.Platform): DaemonProc[];
47
47
  /**
48
- * Pids of running `cli.js receipt-serve` daemons — any install path, any
49
- * cwd — so `stop --all` can sweep orphans the cwd state file does not know
48
+ * Pids of running `cli.js receipt-serve` daemons - any install path, any
49
+ * cwd - so `stop --all` can sweep orphans the cwd state file does not know
50
50
  * about. Never matches this process. `receipt-serve` must appear as a
51
51
  * standalone argv token (the daemon always spawns it as one), so an editor
52
52
  * with `receipt-serve-notes.txt` open does not match. Residual risk,
53
53
  * accepted: a same-uid process deliberately built to look like the daemon
54
- * (`node cli.js receipt-serve`) still matches — but the sweep is scoped to
54
+ * (`node cli.js receipt-serve`) still matches - but the sweep is scoped to
55
55
  * the current user's processes and only ever sends SIGTERM, so the worst
56
56
  * case is a graceful stop of a same-user lookalike.
57
57
  */
@@ -60,8 +60,8 @@ export declare function findReceiptDaemonPids(procs: readonly DaemonProc[]): num
60
60
  * Reuse the running daemon only when its pid is alive, the stored loopback
61
61
  * url answers the token handshake, AND the daemon reports this exact package
62
62
  * version. A daemon from an older (or newer, or pre-version-handshake) build
63
- * may serve a stale trail layout, so any mismatch — including an absent or
64
- * unreadable version field — stops it and spawns a fresh one. A wedged
63
+ * may serve a stale trail layout, so any mismatch - including an absent or
64
+ * unreadable version field - stops it and spawns a fresh one. A wedged
65
65
  * daemon that IS ours is stopped first so failed handshakes cannot leak
66
66
  * orphans; a foreign pid is never signaled.
67
67
  */
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Background live-receipt daemon: `kya start` spawns it detached and returns
3
3
  * to the terminal. State (pid, url, token) lives in `.kya/receipt-server.json`
4
- * (mode 0600 — it carries the loopback auth token); stdout/stderr go to
4
+ * (mode 0600 - it carries the loopback auth token); stdout/stderr go to
5
5
  * `.kya/receipt-server.log`. The daemon child is the hidden `receipt-serve`
6
6
  * command, which writes the state file once it is listening and removes it on
7
7
  * shutdown.
@@ -33,7 +33,7 @@ export function readDaemonState(cwd) {
33
33
  }
34
34
  }
35
35
  catch {
36
- /* corrupt state — treat as absent */
36
+ /* corrupt state - treat as absent */
37
37
  }
38
38
  return undefined;
39
39
  }
@@ -58,13 +58,13 @@ function removeIfSymlink(path) {
58
58
  rmSync(path, { force: true });
59
59
  }
60
60
  catch {
61
- /* absent — nothing to remove */
61
+ /* absent - nothing to remove */
62
62
  }
63
63
  }
64
64
  /**
65
65
  * Remove the state file. With expectedPid set (daemon shutdown), removal is
66
66
  * skipped when the file was already replaced by a newer daemon (pid mismatch)
67
- * — a dying daemon must not delete its successor's state. Read errors /
67
+ * - a dying daemon must not delete its successor's state. Read errors /
68
68
  * missing / corrupt state still remove (we own the normal case).
69
69
  */
70
70
  export function clearDaemonState(cwd, expectedPid) {
@@ -83,7 +83,7 @@ export function pidAlive(pid) {
83
83
  return true;
84
84
  }
85
85
  catch (err) {
86
- // EPERM: process exists but owned by someone else — still alive.
86
+ // EPERM: process exists but owned by someone else - still alive.
87
87
  return err.code === "EPERM";
88
88
  }
89
89
  }
@@ -95,7 +95,7 @@ function cliJsPath() {
95
95
  const built = fileURLToPath(new URL("../cli.js", import.meta.url));
96
96
  if (existsSync(built))
97
97
  return built;
98
- // Running from src/ (vitest) — spawn the built CLI.
98
+ // Running from src/ (vitest) - spawn the built CLI.
99
99
  return fileURLToPath(new URL("../../dist/cli.js", import.meta.url));
100
100
  }
101
101
  /**
@@ -148,13 +148,13 @@ export function listOwnedProcesses(platform = process.platform) {
148
148
  }
149
149
  }
150
150
  /**
151
- * Pids of running `cli.js receipt-serve` daemons — any install path, any
152
- * cwd — so `stop --all` can sweep orphans the cwd state file does not know
151
+ * Pids of running `cli.js receipt-serve` daemons - any install path, any
152
+ * cwd - so `stop --all` can sweep orphans the cwd state file does not know
153
153
  * about. Never matches this process. `receipt-serve` must appear as a
154
154
  * standalone argv token (the daemon always spawns it as one), so an editor
155
155
  * with `receipt-serve-notes.txt` open does not match. Residual risk,
156
156
  * accepted: a same-uid process deliberately built to look like the daemon
157
- * (`node cli.js receipt-serve`) still matches — but the sweep is scoped to
157
+ * (`node cli.js receipt-serve`) still matches - but the sweep is scoped to
158
158
  * the current user's processes and only ever sends SIGTERM, so the worst
159
159
  * case is a graceful stop of a same-user lookalike.
160
160
  */
@@ -171,7 +171,7 @@ export function findReceiptDaemonPids(procs) {
171
171
  * server behind it answers a token-authenticated handshake with 200.
172
172
  * Uses /healthz: O(1) and decoupled from render failures of the full page.
173
173
  * Every failure mode (non-200, unreadable body, missing field) yields a
174
- * probe without a version — callers must treat that as "unknown version",
174
+ * probe without a version - callers must treat that as "unknown version",
175
175
  * never as a match.
176
176
  */
177
177
  async function probeStoredDaemon(state) {
@@ -188,7 +188,7 @@ async function probeStoredDaemon(state) {
188
188
  res.body?.cancel().catch(() => undefined);
189
189
  return { ok: false };
190
190
  }
191
- // Handshake passed; the version may still be unreadable — pre-0.4.1
191
+ // Handshake passed; the version may still be unreadable - pre-0.4.1
192
192
  // daemons answer plain "ok\n". A parse failure is an unknown version,
193
193
  // not a failed handshake.
194
194
  let version;
@@ -222,8 +222,8 @@ async function stopOwnedDaemon(pid) {
222
222
  * Reuse the running daemon only when its pid is alive, the stored loopback
223
223
  * url answers the token handshake, AND the daemon reports this exact package
224
224
  * version. A daemon from an older (or newer, or pre-version-handshake) build
225
- * may serve a stale trail layout, so any mismatch — including an absent or
226
- * unreadable version field — stops it and spawns a fresh one. A wedged
225
+ * may serve a stale trail layout, so any mismatch - including an absent or
226
+ * unreadable version field - stops it and spawns a fresh one. A wedged
227
227
  * daemon that IS ours is stopped first so failed handshakes cannot leak
228
228
  * orphans; a foreign pid is never signaled.
229
229
  */
@@ -235,7 +235,7 @@ export async function ensureReceiptDaemon(config, input) {
235
235
  return { url: existing.url, pid: existing.pid, reused: true };
236
236
  }
237
237
  if (probe.ok) {
238
- // Answered our token handshake with a stale/absent version — it is
238
+ // Answered our token handshake with a stale/absent version - it is
239
239
  // authenticated as a kya daemon even if an older install spawned it
240
240
  // from a different cli.js path, so the args check would miss it.
241
241
  await stopOwnedDaemon(existing.pid);
@@ -274,6 +274,6 @@ export async function ensureReceiptDaemon(config, input) {
274
274
  break;
275
275
  await sleep(100);
276
276
  }
277
- throw new KyaError(`receipt server failed to start — see ${daemonLogPath(config.cwd)}`, "RECEIPT_DAEMON_FAILED");
277
+ throw new KyaError(`receipt server failed to start - see ${daemonLogPath(config.cwd)}`, "RECEIPT_DAEMON_FAILED");
278
278
  }
279
279
  //# sourceMappingURL=daemon.js.map
@@ -55,7 +55,7 @@ export interface BucketWindowInput {
55
55
  /**
56
56
  * Zero-filled bucket window: from the earliest event's bucket up to the
57
57
  * latest, capped to the most recent `cap` buckets, ascending chronologically.
58
- * Candidates are deduped by start ms — stepping back across a spring-forward
58
+ * Candidates are deduped by start ms - stepping back across a spring-forward
59
59
  * transition can map two steps to the same bucket start (duplicate column).
60
60
  * Pure and exported so tests can feed the duplicate-start case directly.
61
61
  */
@@ -25,7 +25,7 @@ const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "
25
25
  function hourLabel(startMs) {
26
26
  return `${String(new Date(startMs).getHours()).padStart(2, "0")}:00`;
27
27
  }
28
- /** "Sep 16 14:00" — used when an hourly window crosses midnight. */
28
+ /** "Sep 16 14:00" - used when an hourly window crosses midnight. */
29
29
  function hourDayLabel(startMs) {
30
30
  const d = new Date(startMs);
31
31
  return `${MONTHS[d.getMonth()]} ${d.getDate()} ${hourLabel(startMs)}`;
@@ -48,7 +48,7 @@ function stepBack(startMs, i, granularity) {
48
48
  /**
49
49
  * Zero-filled bucket window: from the earliest event's bucket up to the
50
50
  * latest, capped to the most recent `cap` buckets, ascending chronologically.
51
- * Candidates are deduped by start ms — stepping back across a spring-forward
51
+ * Candidates are deduped by start ms - stepping back across a spring-forward
52
52
  * transition can map two steps to the same bucket start (duplicate column).
53
53
  * Pure and exported so tests can feed the duplicate-start case directly.
54
54
  */
@@ -1,19 +1,30 @@
1
1
  import type { TrailEvent } from "../trail.js";
2
2
  export interface EmbeddingProvider {
3
3
  embed(text: string): Promise<number[] | undefined>;
4
+ /** Optional batch embed. Providers that implement this can warm the index
5
+ * orders of magnitude faster than one-by-one calls. */
6
+ embedBatch?(texts: string[]): Promise<(number[] | undefined)[] | undefined>;
4
7
  }
5
8
  /** Local MiniLM provider via fastembed; loaded on first use. */
6
9
  export declare class LocalMiniLmProvider implements EmbeddingProvider {
7
10
  private readonly env;
8
- private model;
9
- private tried;
11
+ private queryModel;
12
+ private batchModel;
13
+ private queryTried;
14
+ private batchTried;
15
+ /** fastembed model init is not re-entrant; serialize loadModel calls. */
16
+ private loadLock;
10
17
  constructor(env?: NodeJS.ProcessEnv);
18
+ private withLoadLock;
19
+ private loadModel;
11
20
  embed(text: string): Promise<number[] | undefined>;
21
+ embedBatch(texts: string[]): Promise<(number[] | undefined)[] | undefined>;
12
22
  }
13
23
  /** On-disk cache for event embeddings keyed by event id and document sha1. */
14
24
  export declare class EventEmbeddingCache {
15
25
  private data;
16
- constructor();
26
+ private readonly cacheFile;
27
+ constructor(cacheFile?: string);
17
28
  private load;
18
29
  private save;
19
30
  getCached(eventId: string, textSha1: string): number[] | undefined;
@@ -28,7 +39,7 @@ export declare class EventEmbeddingCache {
28
39
  /**
29
40
  * Build a map of embeddings for the given events. Already-cached entries are
30
41
  * returned without calling the provider; missing entries are embedded and
31
- * written to the cache in a single batch.
42
+ * written to the cache in chunks so the index warms incrementally.
32
43
  */
33
44
  export declare function buildEventEmbeddings(events: readonly TrailEvent[], provider: EmbeddingProvider, cache: EventEmbeddingCache): Promise<Map<string, number[]>>;
34
45
  //# sourceMappingURL=embeddings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/receipt/embeddings.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CACpD;AAyBD,gEAAgE;AAChE,qBAAa,mBAAoB,YAAW,iBAAiB;IAI/C,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAAS;gBAEO,GAAG,GAAE,MAAM,CAAC,UAAwB;IAE3D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;CAiCzD;AAgBD,8EAA8E;AAC9E,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAY;;IAMxB,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,IAAI;IASZ,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAIpE,2EAA2E;IAC3E,OAAO,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,GAAG,IAAI;CAO3G;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAqBhC"}
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/receipt/embeddings.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACnD;2DACuD;IACvD,UAAU,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;CAC7E;AAsBD,gEAAgE;AAChE,qBAAa,mBAAoB,YAAW,iBAAiB;IAQ/C,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPhC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,GAAG,GAAE,MAAM,CAAC,UAAwB;YAEnD,YAAY;YAMZ,SAAS;IA4BjB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;IAmBlD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC;CA0BjF;AAgBD,8EAA8E;AAC9E,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,CAAC,EAAE,MAAM;IAK9B,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,IAAI;IASZ,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAIpE,2EAA2E;IAC3E,OAAO,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,GAAG,IAAI;CAO3G;AAID;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAgDhC"}