@shield-agent/kya 0.3.0 → 0.4.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.
- package/.mcp.json +1 -1
- package/LIMITATIONS.md +1 -0
- package/README.md +17 -3
- package/amp/settings.example.json +1 -1
- package/claude/claude_desktop_config.example.json +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +33 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.d.ts +27 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +43 -8
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/hook.d.ts +17 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +105 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +30 -5
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.d.ts +21 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +76 -22
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/wire-hooks.d.ts +33 -0
- package/dist/commands/wire-hooks.d.ts.map +1 -0
- package/dist/commands/wire-hooks.js +213 -0
- package/dist/commands/wire-hooks.js.map +1 -0
- package/dist/receipt/daemon.d.ts +35 -5
- package/dist/receipt/daemon.d.ts.map +1 -1
- package/dist/receipt/daemon.js +87 -12
- package/dist/receipt/daemon.js.map +1 -1
- package/dist/receipt/live-server.d.ts.map +1 -1
- package/dist/receipt/live-server.js +7 -4
- package/dist/receipt/live-server.js.map +1 -1
- package/dist/trail.d.ts +3 -1
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +20 -0
- package/dist/trail.js.map +1 -1
- 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 +1 -1
- package/qwen/settings.example.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook wiring — install `kya hook --host <id>` as a PreToolUse hook in a
|
|
3
|
+
* coding host's user config. Same write discipline as connect.ts: merge-only
|
|
4
|
+
* for host-owned files (claude settings.json, kimi config.toml), whole-file
|
|
5
|
+
* ownership for the kya-managed grok hook file, all writes symlink-safe and
|
|
6
|
+
* crash-safe via atomicWriteSync/writeTarget/createTarget.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { UsageError } from "../errors.js";
|
|
11
|
+
// imports from connect.ts are call-time only (shared fs/registry helpers) — safe cycle
|
|
12
|
+
import { atomicWriteSync, cliJsPath, CONNECT_REGISTRY, createTarget, writeTarget, } from "./connect.js";
|
|
13
|
+
export const HOOK_HOSTS = ["claude", "grok", "kimi"];
|
|
14
|
+
/** Whether a host has verified PreToolUse hook wiring. */
|
|
15
|
+
export function hookSupported(hostId) {
|
|
16
|
+
return HOOK_HOSTS.includes(hostId.trim().toLowerCase());
|
|
17
|
+
}
|
|
18
|
+
const HOOK_TIMEOUT_SECONDS = 5;
|
|
19
|
+
/** Shell command a host's PreToolUse hook runs. JSON-quoted paths are safe to embed. */
|
|
20
|
+
export function hookCommand(hostId) {
|
|
21
|
+
return [process.execPath, cliJsPath()]
|
|
22
|
+
.map((s) => JSON.stringify(s))
|
|
23
|
+
.join(" ") + ` hook --host ${hostId}`;
|
|
24
|
+
}
|
|
25
|
+
function hookIdentity(hostId) {
|
|
26
|
+
return `hook --host ${hostId}`;
|
|
27
|
+
}
|
|
28
|
+
/** Claude/Grok JSON entry shape: matcher "" matches every tool. */
|
|
29
|
+
function preToolUseEntry(hostId) {
|
|
30
|
+
return {
|
|
31
|
+
matcher: "",
|
|
32
|
+
hooks: [
|
|
33
|
+
{ type: "command", command: hookCommand(hostId), timeout: HOOK_TIMEOUT_SECONDS },
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Merge a PreToolUse hook entry into ~/.claude/settings.json. Merge-only,
|
|
39
|
+
* never clobbers: unparseable JSON or a wrongly-shaped hooks key is refused
|
|
40
|
+
* instead of rewritten. An existing kya entry (matched by command identity)
|
|
41
|
+
* means skipped; --force replaces that one entry, preserving all others.
|
|
42
|
+
*/
|
|
43
|
+
function wireClaudeSettings(path, force) {
|
|
44
|
+
const entry = preToolUseEntry("claude");
|
|
45
|
+
if (!existsSync(path)) {
|
|
46
|
+
atomicWriteSync(createTarget(path), `${JSON.stringify({ hooks: { PreToolUse: [entry] } }, null, 2)}\n`);
|
|
47
|
+
return "created";
|
|
48
|
+
}
|
|
49
|
+
const target = writeTarget(path);
|
|
50
|
+
let raw;
|
|
51
|
+
try {
|
|
52
|
+
raw = JSON.parse(readFileSync(target, "utf8"));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Never rewrite a host's real config we cannot parse — that destroys settings.
|
|
56
|
+
throw new UsageError(`${path} is not valid JSON — fix it by hand or back it up and delete it, then re-run the hook wiring`);
|
|
57
|
+
}
|
|
58
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
59
|
+
throw new UsageError(`${path} is valid JSON but not an object — refusing to clobber it`);
|
|
60
|
+
}
|
|
61
|
+
const hooks = raw["hooks"];
|
|
62
|
+
if (hooks !== undefined && (typeof hooks !== "object" || hooks === null || Array.isArray(hooks))) {
|
|
63
|
+
throw new UsageError(`${path} has "hooks" but it is not an object — refusing to clobber it`);
|
|
64
|
+
}
|
|
65
|
+
const hooksObj = (hooks ?? {});
|
|
66
|
+
const preToolUse = hooksObj["PreToolUse"];
|
|
67
|
+
if (preToolUse !== undefined && !Array.isArray(preToolUse)) {
|
|
68
|
+
throw new UsageError(`${path} has "hooks.PreToolUse" but it is not an array — refusing to clobber it`);
|
|
69
|
+
}
|
|
70
|
+
const entries = (preToolUse ?? []);
|
|
71
|
+
const isKyaEntry = (e) => e != null &&
|
|
72
|
+
Array.isArray(e.hooks) &&
|
|
73
|
+
e.hooks.some((h) => typeof h.command === "string" && h.command.includes(hookIdentity("claude")));
|
|
74
|
+
const kyaIndex = entries.findIndex(isKyaEntry);
|
|
75
|
+
if (kyaIndex !== -1 && !force)
|
|
76
|
+
return "skipped";
|
|
77
|
+
if (kyaIndex !== -1) {
|
|
78
|
+
entries[kyaIndex] = entry;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
entries.push(entry);
|
|
82
|
+
}
|
|
83
|
+
hooksObj["PreToolUse"] = entries;
|
|
84
|
+
raw["hooks"] = hooksObj;
|
|
85
|
+
atomicWriteSync(target, `${JSON.stringify(raw, null, 2)}\n`);
|
|
86
|
+
return "wired";
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* ~/.grok/hooks/shield-kya.json is wholly kya-managed: deterministic content,
|
|
90
|
+
* so an identical file means skipped and anything else is overwritten.
|
|
91
|
+
*/
|
|
92
|
+
function wireGrokHooks(path) {
|
|
93
|
+
const content = `${JSON.stringify({ hooks: { PreToolUse: [preToolUseEntry("grok")] } }, null, 2)}\n`;
|
|
94
|
+
if (!existsSync(path)) {
|
|
95
|
+
atomicWriteSync(createTarget(path), content);
|
|
96
|
+
return "created";
|
|
97
|
+
}
|
|
98
|
+
const target = writeTarget(path);
|
|
99
|
+
if (readFileSync(target, "utf8") === content)
|
|
100
|
+
return "skipped";
|
|
101
|
+
atomicWriteSync(target, content);
|
|
102
|
+
return "wired";
|
|
103
|
+
}
|
|
104
|
+
const KIMI_HOOKS_HEADER_RE = /^[^\S\n]*\[\[hooks\]\][^\S\n]*(?:#.*)?$/m;
|
|
105
|
+
// A plain [hooks] table or a top-level `hooks = …` scalar cannot coexist with
|
|
106
|
+
// an appended [[hooks]] array — the result would be invalid TOML.
|
|
107
|
+
const KIMI_PLAIN_HOOKS_TABLE_RE = /^[^\S\n]*\[hooks\]/m;
|
|
108
|
+
// Deliberately stricter than its sibling: an indented `hooks = …` at top level
|
|
109
|
+
// is rare, and a false-positive refusal is the safe direction here.
|
|
110
|
+
const KIMI_TOP_LEVEL_HOOKS_RE = /^hooks\s*=/m;
|
|
111
|
+
/**
|
|
112
|
+
* Build the [[hooks]] TOML block for a command string. The command goes into
|
|
113
|
+
* a TOML literal string (single quotes) so the embedded JSON-quoted paths are
|
|
114
|
+
* safe — but a literal string cannot hold a single quote or a newline, so
|
|
115
|
+
* refuse those instead of writing invalid TOML into the user's config.
|
|
116
|
+
*/
|
|
117
|
+
export function kimiHooksBlockText(command) {
|
|
118
|
+
if (command.includes("'") || command.includes("\n") || command.includes("\r")) {
|
|
119
|
+
throw new UsageError(`the kya hook command contains a single quote or newline and cannot be embedded in Kimi's TOML config — move the kya install to a path without quotes and re-run the hook wiring`);
|
|
120
|
+
}
|
|
121
|
+
return [
|
|
122
|
+
"[[hooks]]",
|
|
123
|
+
'event = "PreToolUse"',
|
|
124
|
+
`command = '${command}'`,
|
|
125
|
+
`timeout = ${HOOK_TIMEOUT_SECONDS}`,
|
|
126
|
+
"",
|
|
127
|
+
].join("\n");
|
|
128
|
+
}
|
|
129
|
+
function kimiHooksBlock(hostId) {
|
|
130
|
+
return kimiHooksBlockText(hookCommand(hostId));
|
|
131
|
+
}
|
|
132
|
+
function assertKimiAppendable(path, text) {
|
|
133
|
+
if (KIMI_PLAIN_HOOKS_TABLE_RE.test(text) || KIMI_TOP_LEVEL_HOOKS_RE.test(text)) {
|
|
134
|
+
throw new UsageError(`${path} already has a [hooks] table or a top-level hooks key — appending [[hooks]] would produce invalid TOML; fix the config by hand, then re-run the hook wiring`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Minimal TOML wiring for Kimi: append a [[hooks]] array element at EOF, skip
|
|
139
|
+
* when the command identity already appears anywhere in the file (idempotent
|
|
140
|
+
* by substring — quoted variants of our own block still match), --force
|
|
141
|
+
* replaces the containing block (header line through the next table header or
|
|
142
|
+
* EOF). Writes exactly the fields Kimi's config loader accepts.
|
|
143
|
+
*/
|
|
144
|
+
function wireKimiToml(path, force) {
|
|
145
|
+
const block = kimiHooksBlock("kimi");
|
|
146
|
+
if (!existsSync(path)) {
|
|
147
|
+
atomicWriteSync(createTarget(path), block);
|
|
148
|
+
return "created";
|
|
149
|
+
}
|
|
150
|
+
const target = writeTarget(path);
|
|
151
|
+
const text = readFileSync(target, "utf8");
|
|
152
|
+
const identityIndex = text.indexOf(hookIdentity("kimi"));
|
|
153
|
+
if (identityIndex !== -1 && !force)
|
|
154
|
+
return "skipped";
|
|
155
|
+
if (identityIndex === -1) {
|
|
156
|
+
assertKimiAppendable(path, text);
|
|
157
|
+
const sep = text.length === 0 || text.endsWith("\n") ? "" : "\n";
|
|
158
|
+
atomicWriteSync(target, `${text}${sep}${block}`);
|
|
159
|
+
return "wired";
|
|
160
|
+
}
|
|
161
|
+
// --force: replace the [[hooks]] block that contains the identity, from its
|
|
162
|
+
// header line to the next table header or EOF.
|
|
163
|
+
const beforeIdentity = text.slice(0, identityIndex);
|
|
164
|
+
const headers = [...beforeIdentity.matchAll(new RegExp(KIMI_HOOKS_HEADER_RE.source, "gm"))];
|
|
165
|
+
const start = headers.length === 0 ? -1 : headers[headers.length - 1].index;
|
|
166
|
+
if (start === -1) {
|
|
167
|
+
// Identity outside any [[hooks]] block — not ours to rewrite.
|
|
168
|
+
assertKimiAppendable(path, text);
|
|
169
|
+
const sep = text.endsWith("\n") ? "" : "\n";
|
|
170
|
+
atomicWriteSync(target, `${text}${sep}${block}`);
|
|
171
|
+
return "wired";
|
|
172
|
+
}
|
|
173
|
+
const lineEnd = text.indexOf("\n", start);
|
|
174
|
+
const bodyStart = lineEnd === -1 ? text.length : lineEnd + 1;
|
|
175
|
+
const nextHeader = text.slice(bodyStart).search(/^[^\S\n]*\[/m);
|
|
176
|
+
const end = nextHeader === -1 ? text.length : bodyStart + nextHeader;
|
|
177
|
+
atomicWriteSync(target, `${text.slice(0, start)}${block}${text.slice(end)}`);
|
|
178
|
+
return "wired";
|
|
179
|
+
}
|
|
180
|
+
/** Wire `kya hook` into one host's user config. Unknown host → UsageError. */
|
|
181
|
+
export function wireHook(input) {
|
|
182
|
+
const key = input.host.trim().toLowerCase();
|
|
183
|
+
const force = Boolean(input.force);
|
|
184
|
+
let label;
|
|
185
|
+
let path;
|
|
186
|
+
let status;
|
|
187
|
+
switch (key) {
|
|
188
|
+
case "claude":
|
|
189
|
+
label = CONNECT_REGISTRY["claude"].label;
|
|
190
|
+
path = join(input.home, ".claude", "settings.json");
|
|
191
|
+
status = wireClaudeSettings(path, force);
|
|
192
|
+
break;
|
|
193
|
+
case "grok":
|
|
194
|
+
label = CONNECT_REGISTRY["grok"].label;
|
|
195
|
+
path = join(input.home, ".grok", "hooks", "shield-kya.json");
|
|
196
|
+
status = wireGrokHooks(path);
|
|
197
|
+
break;
|
|
198
|
+
case "kimi":
|
|
199
|
+
label = CONNECT_REGISTRY["kimi"].label;
|
|
200
|
+
path = join(input.home, ".kimi-code", "config.toml");
|
|
201
|
+
status = wireKimiToml(path, force);
|
|
202
|
+
break;
|
|
203
|
+
default:
|
|
204
|
+
throw new UsageError(`unknown hook host "${input.host}" — supported: ${HOOK_HOSTS.join(", ")}`);
|
|
205
|
+
}
|
|
206
|
+
return { host: key, label, path, status };
|
|
207
|
+
}
|
|
208
|
+
/** Wire every supported host (or an explicit subset) under one home dir. */
|
|
209
|
+
export function wireHooks(input) {
|
|
210
|
+
const hosts = input.hosts ?? HOOK_HOSTS;
|
|
211
|
+
return hosts.map((host) => wireHook({ host, home: input.home, force: input.force }));
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=wire-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-hooks.js","sourceRoot":"","sources":["../../src/commands/wire-hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/receipt/daemon.d.ts
CHANGED
|
@@ -28,12 +28,42 @@ export declare function pidAlive(pid: number): boolean;
|
|
|
28
28
|
* On non-win32 inspect the process args; on win32 fall back to alive-only.
|
|
29
29
|
*/
|
|
30
30
|
export declare function isReceiptDaemonProcess(pid: number): boolean;
|
|
31
|
+
export interface DaemonProbe {
|
|
32
|
+
/** The stored loopback url answered the token handshake with 200. */
|
|
33
|
+
readonly ok: boolean;
|
|
34
|
+
/** Package version the daemon was built from; absent on pre-0.4.1 daemons. */
|
|
35
|
+
readonly version?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DaemonProc {
|
|
38
|
+
readonly pid: number;
|
|
39
|
+
readonly args: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* pid + command line of every process owned by the current user, via the
|
|
43
|
+
* same ps-based mechanism as host-reload.ts. Empty on win32 (tasklist has
|
|
44
|
+
* no command lines) and on any ps failure.
|
|
45
|
+
*/
|
|
46
|
+
export declare function listOwnedProcesses(platform?: NodeJS.Platform): DaemonProc[];
|
|
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
|
|
50
|
+
* about. Never matches this process. `receipt-serve` must appear as a
|
|
51
|
+
* standalone argv token (the daemon always spawns it as one), so an editor
|
|
52
|
+
* with `receipt-serve-notes.txt` open does not match. Residual risk,
|
|
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
|
|
55
|
+
* the current user's processes and only ever sends SIGTERM, so the worst
|
|
56
|
+
* case is a graceful stop of a same-user lookalike.
|
|
57
|
+
*/
|
|
58
|
+
export declare function findReceiptDaemonPids(procs: readonly DaemonProc[]): number[];
|
|
31
59
|
/**
|
|
32
|
-
* Reuse the running daemon only when its pid is alive
|
|
33
|
-
* url answers the token handshake
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
60
|
+
* Reuse the running daemon only when its pid is alive, the stored loopback
|
|
61
|
+
* url answers the token handshake, AND the daemon reports this exact package
|
|
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
|
|
65
|
+
* daemon that IS ours is stopped first so failed handshakes cannot leak
|
|
66
|
+
* orphans; a foreign pid is never signaled.
|
|
37
67
|
*/
|
|
38
68
|
export declare function ensureReceiptDaemon(config: ResolvedConfig, input: {
|
|
39
69
|
days: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/receipt/daemon.ts"],"names":[],"mappings":"AAsBA,OAAO,EAA4B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/receipt/daemon.ts"],"names":[],"mappings":"AAsBA,OAAO,EAA4B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAI7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAiB3E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAa7E;AAUD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAMxE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS7C;AAcD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAY3D;AAED,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,UAAU,EAAE,CAmB7F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,EAAE,CAU5E;AAoDD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACnE,OAAO,CAAC,mBAAmB,CAAC,CAkD9B"}
|
package/dist/receipt/daemon.js
CHANGED
|
@@ -12,6 +12,7 @@ import { join } from "node:path";
|
|
|
12
12
|
import { fileURLToPath } from "node:url";
|
|
13
13
|
import { configDir, isLoopbackUrl } from "../config.js";
|
|
14
14
|
import { KyaError } from "../errors.js";
|
|
15
|
+
import { CLI_VERSION } from "../version.js";
|
|
15
16
|
export function daemonStatePath(cwd) {
|
|
16
17
|
return join(configDir(cwd), "receipt-server.json");
|
|
17
18
|
}
|
|
@@ -117,14 +118,65 @@ export function isReceiptDaemonProcess(pid) {
|
|
|
117
118
|
return false;
|
|
118
119
|
}
|
|
119
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* pid + command line of every process owned by the current user, via the
|
|
123
|
+
* same ps-based mechanism as host-reload.ts. Empty on win32 (tasklist has
|
|
124
|
+
* no command lines) and on any ps failure.
|
|
125
|
+
*/
|
|
126
|
+
export function listOwnedProcesses(platform = process.platform) {
|
|
127
|
+
if (platform === "win32")
|
|
128
|
+
return [];
|
|
129
|
+
try {
|
|
130
|
+
const out = execFileSync("ps", ["-axo", "pid=,uid=,args="], {
|
|
131
|
+
encoding: "utf8",
|
|
132
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
133
|
+
});
|
|
134
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
|
|
135
|
+
const procs = [];
|
|
136
|
+
for (const line of out.split("\n")) {
|
|
137
|
+
const m = /^\s*(\d+)\s+(\d+)\s+(.*)$/.exec(line);
|
|
138
|
+
if (!m)
|
|
139
|
+
continue;
|
|
140
|
+
if (uid !== undefined && Number(m[2]) !== uid)
|
|
141
|
+
continue;
|
|
142
|
+
procs.push({ pid: Number(m[1]), args: m[3] });
|
|
143
|
+
}
|
|
144
|
+
return procs;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
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
|
|
153
|
+
* about. Never matches this process. `receipt-serve` must appear as a
|
|
154
|
+
* standalone argv token (the daemon always spawns it as one), so an editor
|
|
155
|
+
* with `receipt-serve-notes.txt` open does not match. Residual risk,
|
|
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
|
|
158
|
+
* the current user's processes and only ever sends SIGTERM, so the worst
|
|
159
|
+
* case is a graceful stop of a same-user lookalike.
|
|
160
|
+
*/
|
|
161
|
+
export function findReceiptDaemonPids(procs) {
|
|
162
|
+
const receiptServeToken = /(^|\s|\/)receipt-serve(\s|$)/;
|
|
163
|
+
return procs
|
|
164
|
+
.filter((p) => p.pid !== process.pid &&
|
|
165
|
+
p.args.includes("cli.js") &&
|
|
166
|
+
receiptServeToken.test(p.args))
|
|
167
|
+
.map((p) => p.pid);
|
|
168
|
+
}
|
|
120
169
|
/**
|
|
121
170
|
* A stored state file is only trustworthy if its url is loopback and the
|
|
122
171
|
* server behind it answers a token-authenticated handshake with 200.
|
|
123
172
|
* Uses /healthz: O(1) and decoupled from render failures of the full page.
|
|
173
|
+
* Every failure mode (non-200, unreadable body, missing field) yields a
|
|
174
|
+
* probe without a version — callers must treat that as "unknown version",
|
|
175
|
+
* never as a match.
|
|
124
176
|
*/
|
|
125
|
-
async function
|
|
177
|
+
async function probeStoredDaemon(state) {
|
|
126
178
|
if (!isLoopbackUrl(state.url))
|
|
127
|
-
return false;
|
|
179
|
+
return { ok: false };
|
|
128
180
|
try {
|
|
129
181
|
const target = new URL("/healthz", new URL(state.url));
|
|
130
182
|
const res = await fetch(target, {
|
|
@@ -132,11 +184,25 @@ async function verifyStoredDaemon(state) {
|
|
|
132
184
|
redirect: "error",
|
|
133
185
|
signal: AbortSignal.timeout(1500),
|
|
134
186
|
});
|
|
135
|
-
res.
|
|
136
|
-
|
|
187
|
+
if (res.status !== 200) {
|
|
188
|
+
res.body?.cancel().catch(() => undefined);
|
|
189
|
+
return { ok: false };
|
|
190
|
+
}
|
|
191
|
+
// Handshake passed; the version may still be unreadable — pre-0.4.1
|
|
192
|
+
// daemons answer plain "ok\n". A parse failure is an unknown version,
|
|
193
|
+
// not a failed handshake.
|
|
194
|
+
let version;
|
|
195
|
+
try {
|
|
196
|
+
const body = JSON.parse(await res.text());
|
|
197
|
+
version = typeof body.version === "string" ? body.version : undefined;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
version = undefined;
|
|
201
|
+
}
|
|
202
|
+
return { ok: true, version };
|
|
137
203
|
}
|
|
138
204
|
catch {
|
|
139
|
-
return false;
|
|
205
|
+
return { ok: false };
|
|
140
206
|
}
|
|
141
207
|
}
|
|
142
208
|
/** SIGTERM our own wedged daemon and wait for it to exit (past the live
|
|
@@ -153,19 +219,28 @@ async function stopOwnedDaemon(pid) {
|
|
|
153
219
|
}
|
|
154
220
|
}
|
|
155
221
|
/**
|
|
156
|
-
* Reuse the running daemon only when its pid is alive
|
|
157
|
-
* url answers the token handshake
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
222
|
+
* Reuse the running daemon only when its pid is alive, the stored loopback
|
|
223
|
+
* url answers the token handshake, AND the daemon reports this exact package
|
|
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
|
|
227
|
+
* daemon that IS ours is stopped first so failed handshakes cannot leak
|
|
228
|
+
* orphans; a foreign pid is never signaled.
|
|
161
229
|
*/
|
|
162
230
|
export async function ensureReceiptDaemon(config, input) {
|
|
163
231
|
const existing = readDaemonState(config.cwd);
|
|
164
232
|
if (existing && pidAlive(existing.pid)) {
|
|
165
|
-
|
|
233
|
+
const probe = await probeStoredDaemon(existing);
|
|
234
|
+
if (probe.ok && probe.version === CLI_VERSION) {
|
|
166
235
|
return { url: existing.url, pid: existing.pid, reused: true };
|
|
167
236
|
}
|
|
168
|
-
if (
|
|
237
|
+
if (probe.ok) {
|
|
238
|
+
// Answered our token handshake with a stale/absent version — it is
|
|
239
|
+
// authenticated as a kya daemon even if an older install spawned it
|
|
240
|
+
// from a different cli.js path, so the args check would miss it.
|
|
241
|
+
await stopOwnedDaemon(existing.pid);
|
|
242
|
+
}
|
|
243
|
+
else if (isReceiptDaemonProcess(existing.pid)) {
|
|
169
244
|
await stopOwnedDaemon(existing.pid);
|
|
170
245
|
}
|
|
171
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/receipt/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAuB,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/receipt/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-server.d.ts","sourceRoot":"","sources":["../../src/receipt/live-server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"live-server.d.ts","sourceRoot":"","sources":["../../src/receipt/live-server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAmBD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAgL5B"}
|
|
@@ -6,6 +6,7 @@ import { randomBytes } from "node:crypto";
|
|
|
6
6
|
import { mkdirSync, watch } from "node:fs";
|
|
7
7
|
import { createServer } from "node:http";
|
|
8
8
|
import { dirname } from "node:path";
|
|
9
|
+
import { CLI_VERSION } from "../version.js";
|
|
9
10
|
import { loadReceiptModel, renderReceiptHtml } from "./render-receipt.js";
|
|
10
11
|
import { trailPath } from "../trail.js";
|
|
11
12
|
const LOOPBACK = "127.0.0.1";
|
|
@@ -63,10 +64,12 @@ export function startLiveReceiptServer(options) {
|
|
|
63
64
|
return unauthorized(res);
|
|
64
65
|
}
|
|
65
66
|
if (req.method === "GET" && url.pathname === "/healthz") {
|
|
66
|
-
// Cheap liveness handshake for daemon reuse — never renders,
|
|
67
|
-
// render-time failure (e.g. assertNoSecrets) cannot wedge it.
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
// Cheap liveness + version handshake for daemon reuse — never renders,
|
|
68
|
+
// so a render-time failure (e.g. assertNoSecrets) cannot wedge it. The
|
|
69
|
+
// version lets a newer CLI refuse to reuse a stale daemon left running
|
|
70
|
+
// by an older install.
|
|
71
|
+
res.writeHead(200, { "Content-Type": "application/json; charset=utf-8" });
|
|
72
|
+
res.end(`${JSON.stringify({ ok: true, version: CLI_VERSION })}\n`);
|
|
70
73
|
return;
|
|
71
74
|
}
|
|
72
75
|
if (req.method === "GET" && url.pathname === "/events") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-server.js","sourceRoot":"","sources":["../../src/receipt/live-server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"live-server.js","sourceRoot":"","sources":["../../src/receipt/live-server.ts"],"names":[],"mappings":"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"}
|
package/dist/trail.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type TrailProduct = "cursor" | "claude" | "codex" | "grok" | "ide" | "runtime" | "other";
|
|
1
|
+
export type TrailProduct = "cursor" | "claude" | "codex" | "grok" | "kimi" | "ide" | "runtime" | "other";
|
|
2
2
|
export interface TrailEvent {
|
|
3
3
|
readonly ts: string;
|
|
4
4
|
readonly sessionId: string;
|
|
@@ -28,6 +28,8 @@ export declare function receiptsDir(cwd: string): string;
|
|
|
28
28
|
/** Detect Cursor / Claude Code / Codex / Grok / host from env. */
|
|
29
29
|
export declare function detectProduct(env?: NodeJS.ProcessEnv, host?: string): TrailProduct;
|
|
30
30
|
export declare function productLabel(p: TrailProduct | undefined): string;
|
|
31
|
+
/** Map a hook --host id to the trail product (explicit beats env sniffing). */
|
|
32
|
+
export declare function hostToProduct(host: string): TrailProduct;
|
|
31
33
|
export declare function appendTrail(cwd: string, event: TrailEvent, env?: NodeJS.ProcessEnv): void;
|
|
32
34
|
/** trail.jsonl read cap — oversized files are tail-read (recent events win). */
|
|
33
35
|
export declare const MAX_TRAIL_BYTES: number;
|
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,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;CAC/B;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,
|
|
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;CAC/B;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;AAqDD,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
|
@@ -48,6 +48,8 @@ export function productLabel(p) {
|
|
|
48
48
|
return "Codex";
|
|
49
49
|
case "grok":
|
|
50
50
|
return "Grok";
|
|
51
|
+
case "kimi":
|
|
52
|
+
return "Kimi Code";
|
|
51
53
|
case "ide":
|
|
52
54
|
return "IDE";
|
|
53
55
|
case "runtime":
|
|
@@ -56,6 +58,23 @@ export function productLabel(p) {
|
|
|
56
58
|
return "Other";
|
|
57
59
|
}
|
|
58
60
|
}
|
|
61
|
+
/** Map a hook --host id to the trail product (explicit beats env sniffing). */
|
|
62
|
+
export function hostToProduct(host) {
|
|
63
|
+
switch (host) {
|
|
64
|
+
case "claude":
|
|
65
|
+
return "claude";
|
|
66
|
+
case "grok":
|
|
67
|
+
return "grok";
|
|
68
|
+
case "kimi":
|
|
69
|
+
return "kimi";
|
|
70
|
+
case "cursor":
|
|
71
|
+
return "cursor";
|
|
72
|
+
case "codex":
|
|
73
|
+
return "codex";
|
|
74
|
+
default:
|
|
75
|
+
return "other";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
59
78
|
export function appendTrail(cwd, event, env = process.env) {
|
|
60
79
|
mkdirSync(globalConfigDir(env), { recursive: true });
|
|
61
80
|
const enriched = {
|
|
@@ -71,6 +90,7 @@ const TRAIL_PRODUCTS = new Set([
|
|
|
71
90
|
"claude",
|
|
72
91
|
"codex",
|
|
73
92
|
"grok",
|
|
93
|
+
"kimi",
|
|
74
94
|
"ide",
|
|
75
95
|
"runtime",
|
|
76
96
|
"other",
|
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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"}
|