@shield-agent/kya 0.1.40 → 0.1.42
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/README.md +3 -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/commands/receipt-serve.d.ts.map +1 -1
- package/dist/commands/receipt-serve.js +3 -1
- package/dist/commands/receipt-serve.js.map +1 -1
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +9 -1
- package/dist/commands/stop.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/dash/render.d.ts +2 -1
- package/dist/dash/render.d.ts.map +1 -1
- package/dist/dash/render.js +9 -3
- package/dist/dash/render.js.map +1 -1
- package/dist/receipt/daemon.d.ts +17 -3
- package/dist/receipt/daemon.d.ts.map +1 -1
- package/dist/receipt/daemon.js +110 -13
- package/dist/receipt/daemon.js.map +1 -1
- package/dist/receipt/enrich.d.ts +1 -1
- package/dist/receipt/enrich.d.ts.map +1 -1
- package/dist/receipt/enrich.js +76 -76
- package/dist/receipt/enrich.js.map +1 -1
- package/dist/receipt/live-server.d.ts.map +1 -1
- package/dist/receipt/live-server.js +10 -2
- package/dist/receipt/live-server.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +3 -0
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +59 -23
- package/dist/receipt/render-receipt.js.map +1 -1
- package/dist/trail.d.ts +2 -0
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +73 -3
- 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
package/dist/receipt/enrich.js
CHANGED
|
@@ -8,9 +8,7 @@ import { lstatSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
|
8
8
|
import { homedir } from "node:os";
|
|
9
9
|
import { join, resolve, sep } from "node:path";
|
|
10
10
|
import { CONNECT_REGISTRY } from "../commands/connect.js";
|
|
11
|
-
import { readFileConfig } from "../config.js";
|
|
12
11
|
import { hostReload, hostRunning, listProcessNames, } from "../host-reload.js";
|
|
13
|
-
import { loadSandboxState } from "../sandbox/runtime.js";
|
|
14
12
|
import { buildShowback, } from "../showback/cost-per-task.js";
|
|
15
13
|
import { MAX_USAGE_FILE_BYTES, parseUsageFilePayload, } from "../showback/usage-file.js";
|
|
16
14
|
const MAX_ORR_REPORT_BYTES = 256 * 1024;
|
|
@@ -38,35 +36,46 @@ function confinedFile(file, root) {
|
|
|
38
36
|
return undefined;
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
const MAX_CWD_STATE_BYTES = 1024 * 1024;
|
|
40
|
+
/**
|
|
41
|
+
* Parse a JSON file strictly inside cwd: symlink refusal, realpath jail,
|
|
42
|
+
* regular-file check, size cap. Returns undefined on any failure.
|
|
43
|
+
*/
|
|
44
|
+
function readConfinedJsonFile(cwd, relPath, maxBytes) {
|
|
45
|
+
const path = confinedFile(join(cwd, relPath), cwd);
|
|
46
|
+
if (!path)
|
|
47
|
+
return undefined;
|
|
44
48
|
try {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const v = raw[key];
|
|
49
|
-
if (typeof v !== "string" || !v.trim())
|
|
50
|
-
continue;
|
|
51
|
-
if (key === "host" && v !== "ide" && v !== "runtime")
|
|
52
|
-
continue;
|
|
53
|
-
out[key] = v;
|
|
54
|
-
}
|
|
55
|
-
return Object.keys(out).length > 0 ? out : undefined;
|
|
49
|
+
if (statSync(path).size > maxBytes)
|
|
50
|
+
return undefined;
|
|
51
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
56
52
|
}
|
|
57
53
|
catch {
|
|
58
54
|
return undefined;
|
|
59
55
|
}
|
|
60
56
|
}
|
|
57
|
+
/** Local identity from .kya/config.json; config.json never holds the API key.
|
|
58
|
+
* Only string fields pass through; baseUrl is inert display text (never a link). */
|
|
59
|
+
export function loadIdentity(cwd) {
|
|
60
|
+
const raw = readConfinedJsonFile(cwd, join(".kya", "config.json"), MAX_CWD_STATE_BYTES);
|
|
61
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
62
|
+
return undefined;
|
|
63
|
+
const source = raw;
|
|
64
|
+
const out = {};
|
|
65
|
+
for (const key of ["agentId", "agentName", "host", "baseUrl"]) {
|
|
66
|
+
const v = source[key];
|
|
67
|
+
if (typeof v !== "string" || !v.trim())
|
|
68
|
+
continue;
|
|
69
|
+
if (key === "host" && v !== "ide" && v !== "runtime")
|
|
70
|
+
continue;
|
|
71
|
+
out[key] = v;
|
|
72
|
+
}
|
|
73
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
74
|
+
}
|
|
61
75
|
export function loadSandboxes(cwd, env = process.env) {
|
|
62
76
|
const backend = env.KYA_SANDBOX?.trim().toLowerCase() || undefined;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
sandboxes = loadSandboxState(cwd);
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
sandboxes = [];
|
|
69
|
-
}
|
|
77
|
+
const raw = readConfinedJsonFile(cwd, join(".kya", "sandboxes.json"), MAX_CWD_STATE_BYTES);
|
|
78
|
+
const sandboxes = Array.isArray(raw) ? raw : [];
|
|
70
79
|
return { backend, sandboxes };
|
|
71
80
|
}
|
|
72
81
|
const ORR_RATINGS = new Set(["green", "amber", "red"]);
|
|
@@ -76,67 +85,54 @@ function strOr(v) {
|
|
|
76
85
|
}
|
|
77
86
|
/** Slim ORR card from <cwd>/orr-report/report.json (default orr --out). */
|
|
78
87
|
export function loadOrrCard(cwd) {
|
|
79
|
-
const
|
|
80
|
-
if (!
|
|
88
|
+
const raw = readConfinedJsonFile(cwd, join("orr-report", "report.json"), MAX_ORR_REPORT_BYTES);
|
|
89
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
81
90
|
return undefined;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
case "partial":
|
|
106
|
-
counts.partial += 1;
|
|
107
|
-
break;
|
|
108
|
-
case "not_evaluated":
|
|
109
|
-
counts.notEvaluated += 1;
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
91
|
+
const report = raw;
|
|
92
|
+
if (typeof report.overall !== "string" ||
|
|
93
|
+
!ORR_RATINGS.has(report.overall) ||
|
|
94
|
+
typeof report.disposition !== "string" ||
|
|
95
|
+
!ORR_DISPOSITIONS.has(report.disposition)) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
const counts = { pass: 0, fail: 0, partial: 0, notEvaluated: 0 };
|
|
99
|
+
if (Array.isArray(report.scorecards)) {
|
|
100
|
+
for (const card of report.scorecards) {
|
|
101
|
+
switch (card?.result) {
|
|
102
|
+
case "pass":
|
|
103
|
+
counts.pass += 1;
|
|
104
|
+
break;
|
|
105
|
+
case "fail":
|
|
106
|
+
counts.fail += 1;
|
|
107
|
+
break;
|
|
108
|
+
case "partial":
|
|
109
|
+
counts.partial += 1;
|
|
110
|
+
break;
|
|
111
|
+
case "not_evaluated":
|
|
112
|
+
counts.notEvaluated += 1;
|
|
113
|
+
break;
|
|
112
114
|
}
|
|
113
115
|
}
|
|
114
|
-
const targetName = report.target && typeof report.target.name === "string"
|
|
115
|
-
? report.target.name.slice(0, MAX_ORR_TEXT_CHARS)
|
|
116
|
-
: undefined;
|
|
117
|
-
return {
|
|
118
|
-
overall: report.overall,
|
|
119
|
-
disposition: report.disposition,
|
|
120
|
-
primaryFailureMode: strOr(report.primary_failure_mode).slice(0, MAX_ORR_TEXT_CHARS),
|
|
121
|
-
mostUrgentFix: strOr(report.most_urgent_fix).slice(0, MAX_ORR_TEXT_CHARS),
|
|
122
|
-
generatedAt: strOr(report.generated_at),
|
|
123
|
-
targetName,
|
|
124
|
-
scorecards: counts,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
return undefined;
|
|
129
116
|
}
|
|
117
|
+
const targetName = report.target && typeof report.target.name === "string"
|
|
118
|
+
? report.target.name.slice(0, MAX_ORR_TEXT_CHARS)
|
|
119
|
+
: undefined;
|
|
120
|
+
return {
|
|
121
|
+
overall: report.overall,
|
|
122
|
+
disposition: report.disposition,
|
|
123
|
+
primaryFailureMode: strOr(report.primary_failure_mode).slice(0, MAX_ORR_TEXT_CHARS),
|
|
124
|
+
mostUrgentFix: strOr(report.most_urgent_fix).slice(0, MAX_ORR_TEXT_CHARS),
|
|
125
|
+
generatedAt: strOr(report.generated_at),
|
|
126
|
+
targetName,
|
|
127
|
+
scorecards: counts,
|
|
128
|
+
};
|
|
130
129
|
}
|
|
131
130
|
/** Observe-only showback from .kya/usage.json inside cwd. */
|
|
132
131
|
export function loadShowbackCard(cwd) {
|
|
133
|
-
const
|
|
134
|
-
if (
|
|
132
|
+
const raw = readConfinedJsonFile(cwd, join(".kya", "usage.json"), MAX_USAGE_FILE_BYTES);
|
|
133
|
+
if (raw === undefined)
|
|
135
134
|
return undefined;
|
|
136
135
|
try {
|
|
137
|
-
if (statSync(path).size > MAX_USAGE_FILE_BYTES)
|
|
138
|
-
return undefined;
|
|
139
|
-
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
140
136
|
const records = parseUsageFilePayload(raw);
|
|
141
137
|
if (records.length === 0)
|
|
142
138
|
return undefined;
|
|
@@ -148,7 +144,11 @@ export function loadShowbackCard(cwd) {
|
|
|
148
144
|
}
|
|
149
145
|
function hasWiredEntry(path, rootKey) {
|
|
150
146
|
try {
|
|
151
|
-
|
|
147
|
+
// statSync follows symlinks on purpose (dotfile setups symlink host
|
|
148
|
+
// configs) — but only regular files are ever read: FIFOs, devices and
|
|
149
|
+
// sockets would block or stream forever.
|
|
150
|
+
const st = statSync(path);
|
|
151
|
+
if (!st.isFile() || st.size > MAX_HOST_CONFIG_BYTES)
|
|
152
152
|
return false;
|
|
153
153
|
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
154
154
|
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/receipt/enrich.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/receipt/enrich.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,EAAa,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAO9D,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,
|
|
1
|
+
{"version":3,"file":"live-server.d.ts","sourceRoot":"","sources":["../../src/receipt/live-server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAO9D,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,CA8K5B"}
|
|
@@ -63,6 +63,13 @@ export function startLiveReceiptServer(options) {
|
|
|
63
63
|
if (!tokenOk(url, req, token)) {
|
|
64
64
|
return unauthorized(res);
|
|
65
65
|
}
|
|
66
|
+
if (req.method === "GET" && url.pathname === "/healthz") {
|
|
67
|
+
// Cheap liveness handshake for daemon reuse — never renders, so a
|
|
68
|
+
// render-time failure (e.g. assertNoSecrets) cannot wedge it.
|
|
69
|
+
res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
|
|
70
|
+
res.end("ok\n");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
66
73
|
if (req.method === "GET" && url.pathname === "/events") {
|
|
67
74
|
if (clients.size >= MAX_SSE_CLIENTS) {
|
|
68
75
|
res.writeHead(503, { "Content-Type": "text/plain; charset=utf-8" });
|
|
@@ -90,6 +97,9 @@ export function startLiveReceiptServer(options) {
|
|
|
90
97
|
sessionId: options.sessionId,
|
|
91
98
|
days: options.days,
|
|
92
99
|
live: true,
|
|
100
|
+
// Token rides the model into the script tag — never a post-hoc
|
|
101
|
+
// string replace on rendered HTML (attacker text could anchor it).
|
|
102
|
+
liveToken: token,
|
|
93
103
|
}));
|
|
94
104
|
}
|
|
95
105
|
catch {
|
|
@@ -97,8 +107,6 @@ export function startLiveReceiptServer(options) {
|
|
|
97
107
|
res.end("receipt render failed\n");
|
|
98
108
|
return;
|
|
99
109
|
}
|
|
100
|
-
// Inject token into EventSource so the browser can auth without a second prompt.
|
|
101
|
-
html = html.replace("EventSource('/events')", `EventSource('/events?t=${token}')`);
|
|
102
110
|
res.writeHead(200, {
|
|
103
111
|
"Content-Type": "text/html; charset=utf-8",
|
|
104
112
|
"Cache-Control": "no-store",
|
|
@@ -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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"}
|
|
@@ -17,6 +17,8 @@ export interface ReceiptModel {
|
|
|
17
17
|
}[];
|
|
18
18
|
/** When true, page connects to /events SSE for live refresh. */
|
|
19
19
|
readonly live?: boolean;
|
|
20
|
+
/** Loopback SSE token — set only by the live server, never in static renders. */
|
|
21
|
+
readonly liveToken?: string;
|
|
20
22
|
/** Local identity from .kya/config.json (inert text; never a link). */
|
|
21
23
|
readonly identity?: KyaFileConfig;
|
|
22
24
|
/** Sandbox state + configured KYA_SANDBOX backend. */
|
|
@@ -70,6 +72,7 @@ export declare function loadReceiptModel(input: {
|
|
|
70
72
|
readonly sessionId?: string;
|
|
71
73
|
readonly days: number;
|
|
72
74
|
readonly live?: boolean;
|
|
75
|
+
readonly liveToken?: string;
|
|
73
76
|
}): ReceiptModel;
|
|
74
77
|
export declare function renderReceiptHtml(model: ReceiptModel): string;
|
|
75
78
|
export declare function renderReceiptMarkdown(model: ReceiptModel): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-receipt.d.ts","sourceRoot":"","sources":["../../src/receipt/render-receipt.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2C,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpF,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9C,iDAAiD;IACjD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;CACpC;
|
|
1
|
+
{"version":3,"file":"render-receipt.d.ts","sourceRoot":"","sources":["../../src/receipt/render-receipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Activity feed HTML/MD for local trail events.
|
|
3
3
|
*/
|
|
4
|
-
import { assertNoSecrets, clip } from "../dash/render.js";
|
|
4
|
+
import { assertNoSecrets, clip, stripEscapes } from "../dash/render.js";
|
|
5
5
|
import { clipMultiline, DIFF_MAX_TOTAL_CHARS } from "../diff-preview.js";
|
|
6
6
|
import { productLabel, readTrail, readTrailSince } from "../trail.js";
|
|
7
7
|
import { loadIdentity, loadOrrCard, loadSandboxes, loadShowbackCard, loadWiredHosts, } from "./enrich.js";
|
|
8
8
|
import { SHOWBACK_DISCLAIMER, } from "../showback/cost-per-task.js";
|
|
9
9
|
function esc(s) {
|
|
10
|
-
return s
|
|
10
|
+
return stripEscapes(s)
|
|
11
11
|
.replace(/&/g, "&")
|
|
12
12
|
.replace(/</g, "<")
|
|
13
13
|
.replace(/>/g, ">")
|
|
14
14
|
.replace(/"/g, """);
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Sanitize untrusted text for the Markdown artifact: strip ANSI/control and
|
|
18
|
+
* bidi/zero-width chars (stripEscapes), then escape the MD/HTML-significant
|
|
19
|
+
* characters so values cannot break formatting or inject raw HTML/links.
|
|
20
|
+
*/
|
|
21
|
+
function mdText(s) {
|
|
22
|
+
return stripEscapes(s)
|
|
23
|
+
.replace(/`/g, "\\`")
|
|
24
|
+
.replace(/([[\]<>])/g, "\\$1");
|
|
25
|
+
}
|
|
26
|
+
/** Fence one tilde longer than the longest run in content (min 4). */
|
|
27
|
+
function mdFence(content) {
|
|
28
|
+
let longest = 0;
|
|
29
|
+
for (const m of content.matchAll(/~+/g)) {
|
|
30
|
+
longest = Math.max(longest, m[0].length);
|
|
31
|
+
}
|
|
32
|
+
return "~".repeat(Math.max(4, longest + 1));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sanitize a value for an inline `code span`: backslash-escapes are literal
|
|
36
|
+
* inside code spans, so backticks are replaced outright (they would still
|
|
37
|
+
* terminate the span); brackets/angles need no escaping inside a span.
|
|
38
|
+
*/
|
|
39
|
+
function mdInline(s) {
|
|
40
|
+
return stripEscapes(s).replace(/`/g, "'");
|
|
41
|
+
}
|
|
16
42
|
function countVerdicts(events) {
|
|
17
43
|
let allow = 0;
|
|
18
44
|
let deny = 0;
|
|
@@ -157,6 +183,7 @@ export function buildReceiptModel(sessionId, events, extras) {
|
|
|
157
183
|
spend: extras?.spend,
|
|
158
184
|
mcpSeen: extras?.mcpSeen,
|
|
159
185
|
live: extras?.live,
|
|
186
|
+
liveToken: extras?.liveToken,
|
|
160
187
|
identity: extras?.identity,
|
|
161
188
|
sandboxes: extras?.sandboxes,
|
|
162
189
|
wiredHosts: extras?.wiredHosts,
|
|
@@ -174,6 +201,7 @@ export function buildWindowReceiptModel(events, days, extras) {
|
|
|
174
201
|
spend: extras?.spend,
|
|
175
202
|
mcpSeen: extras?.mcpSeen,
|
|
176
203
|
live: extras?.live,
|
|
204
|
+
liveToken: extras?.liveToken,
|
|
177
205
|
identity: extras?.identity,
|
|
178
206
|
sandboxes: extras?.sandboxes,
|
|
179
207
|
wiredHosts: extras?.wiredHosts,
|
|
@@ -187,6 +215,7 @@ export function loadReceiptModel(input) {
|
|
|
187
215
|
const showback = loadShowbackCard(input.cwd);
|
|
188
216
|
const extras = {
|
|
189
217
|
live: input.live,
|
|
218
|
+
liveToken: input.liveToken,
|
|
190
219
|
identity: loadIdentity(input.cwd),
|
|
191
220
|
sandboxes: loadSandboxes(input.cwd),
|
|
192
221
|
wiredHosts: loadWiredHosts(input.cwd),
|
|
@@ -445,11 +474,14 @@ export function renderReceiptHtml(model) {
|
|
|
445
474
|
<span class="label">Tools</span>
|
|
446
475
|
${tools.map((t) => `<code>${esc(t)}</code>`).join("")}
|
|
447
476
|
</footer>`;
|
|
477
|
+
// liveToken is minted base64url by the live server — safe in a JS string
|
|
478
|
+
// literal; static renders omit it. No post-hoc html.replace (spoofable).
|
|
479
|
+
const eventsUrl = model.liveToken ? `/events?t=${model.liveToken}` : "/events";
|
|
448
480
|
const liveScript = model.live
|
|
449
481
|
? `<script>
|
|
450
482
|
(function(){
|
|
451
483
|
var pill = document.querySelector('.live');
|
|
452
|
-
var es = new EventSource('
|
|
484
|
+
var es = new EventSource('${eventsUrl}');
|
|
453
485
|
es.onmessage = function(){ location.reload(); };
|
|
454
486
|
es.onerror = function(){
|
|
455
487
|
if (pill) { pill.textContent = 'Offline'; pill.classList.add('off'); }
|
|
@@ -652,7 +684,6 @@ export function renderReceiptHtml(model) {
|
|
|
652
684
|
text-transform: uppercase; color: var(--day);
|
|
653
685
|
background: color-mix(in srgb, var(--bg) 55%, var(--card));
|
|
654
686
|
border-bottom: 1px solid var(--line);
|
|
655
|
-
position: sticky; top: 4.2rem; z-index: 1;
|
|
656
687
|
}
|
|
657
688
|
.ev {
|
|
658
689
|
display: grid; grid-template-columns: 1.1rem 1fr; gap: 0;
|
|
@@ -797,9 +828,9 @@ export function renderReceiptMarkdown(model) {
|
|
|
797
828
|
const agg = aggregateEvents(model.events);
|
|
798
829
|
const nowMs = Date.now();
|
|
799
830
|
const lines = [
|
|
800
|
-
`# ${model.title}`,
|
|
831
|
+
`# ${mdText(model.title)}`,
|
|
801
832
|
"",
|
|
802
|
-
model.rangeLabel,
|
|
833
|
+
mdText(model.rangeLabel),
|
|
803
834
|
"",
|
|
804
835
|
`Allow ${c.allow} | Deny ${c.deny} | Hold ${c.require} | Never ${c.never}`,
|
|
805
836
|
"",
|
|
@@ -811,7 +842,7 @@ export function renderReceiptMarkdown(model) {
|
|
|
811
842
|
: (id.agentName ?? id.agentId);
|
|
812
843
|
const bits = [nameId, id.host, id.baseUrl].filter((b) => typeof b === "string" && b.trim().length > 0);
|
|
813
844
|
if (bits.length > 0) {
|
|
814
|
-
lines.push(bits.join(" · "), "");
|
|
845
|
+
lines.push(mdText(bits.join(" · ")), "");
|
|
815
846
|
}
|
|
816
847
|
}
|
|
817
848
|
const modeBits = [
|
|
@@ -827,36 +858,41 @@ export function renderReceiptMarkdown(model) {
|
|
|
827
858
|
lines.push(`Modes: ${modeBits.join(" | ") || "-"} · Planes: ${planeBits.join(" | ") || "-"}`, "");
|
|
828
859
|
}
|
|
829
860
|
if (agg.products.length >= 2) {
|
|
830
|
-
lines.push("## Products", ...agg.products.map((p) => `- ${p.label} × ${p.count}`), "");
|
|
861
|
+
lines.push("## Products", ...agg.products.map((p) => `- ${mdText(p.label)} × ${p.count}`), "");
|
|
831
862
|
}
|
|
832
863
|
lines.push("## Feed", ...[...model.events]
|
|
833
864
|
.sort((a, b) => b.ts.localeCompare(a.ts))
|
|
834
865
|
.flatMap((e) => {
|
|
835
|
-
const sum = e.summary?.trim() ? ` - ${e.summary.trim()}` : "";
|
|
836
|
-
const head = `- **${verdictWord(e.verdict)}** \`${e.toolId}\`${sum} - ${productLabel(e.product)} - ${e.reasonCode}`;
|
|
866
|
+
const sum = e.summary?.trim() ? ` - ${mdText(e.summary.trim())}` : "";
|
|
867
|
+
const head = `- **${mdText(verdictWord(e.verdict))}** \`${mdInline(e.toolId)}\`${sum} - ${productLabel(e.product)} - ${mdText(e.reasonCode)}`;
|
|
837
868
|
if (!e.diffPreview?.trim())
|
|
838
869
|
return [head];
|
|
839
|
-
|
|
870
|
+
// Fenced content is verbatim (stripEscapes only — backslash escapes
|
|
871
|
+
// are literal in code fences); the dynamically sized tilde fence
|
|
872
|
+
// prevents breakout and backticks cannot close a tilde fence.
|
|
873
|
+
const diff = stripEscapes(e.diffPreview.trim());
|
|
874
|
+
const fence = mdFence(diff);
|
|
875
|
+
return [head, "", fence, diff, fence, ""];
|
|
840
876
|
}), "");
|
|
841
877
|
if (agg.sessions.length > 0) {
|
|
842
|
-
lines.push("## Sessions", ...agg.sessions.map((s) => `- \`${s.sessionId}\` — ${s.events} event${s.events === 1 ? "" : "s"}, worst: ${s.worst}, last ${relativeTime(s.lastTs, nowMs)}`), "");
|
|
878
|
+
lines.push("## Sessions", ...agg.sessions.map((s) => `- \`${mdInline(s.sessionId)}\` — ${s.events} event${s.events === 1 ? "" : "s"}, worst: ${s.worst}, last ${relativeTime(s.lastTs, nowMs)}`), "");
|
|
843
879
|
}
|
|
844
880
|
if (agg.reasons.length > 0) {
|
|
845
|
-
lines.push("## Reasons", ...agg.reasons.map((r) => `- ${r.label} × ${r.count}`), "");
|
|
881
|
+
lines.push("## Reasons", ...agg.reasons.map((r) => `- ${mdText(r.label)} × ${r.count}`), "");
|
|
846
882
|
}
|
|
847
883
|
const hosts = model.wiredHosts ?? [];
|
|
848
884
|
if (hosts.some((h) => h.wired !== "none")) {
|
|
849
885
|
lines.push("## Wired hosts");
|
|
850
886
|
for (const h of hosts) {
|
|
851
887
|
if (h.recipeOnly) {
|
|
852
|
-
lines.push(`- ${h.label} — manual setup (docs recipe)`);
|
|
888
|
+
lines.push(`- ${mdText(h.label)} — manual setup (docs recipe)`);
|
|
853
889
|
}
|
|
854
890
|
else if (h.wired === "none") {
|
|
855
|
-
lines.push(`- ${h.label} — not wired`);
|
|
891
|
+
lines.push(`- ${mdText(h.label)} — not wired`);
|
|
856
892
|
}
|
|
857
893
|
else {
|
|
858
|
-
const reload = h.reload ? ` · ${h.reload.reload}` : "";
|
|
859
|
-
lines.push(`- ${h.label} — wired (${h.wired})${reload} · ${h.running ? "running" : "not running"}`);
|
|
894
|
+
const reload = h.reload ? ` · ${mdText(h.reload.reload)}` : "";
|
|
895
|
+
lines.push(`- ${mdText(h.label)} — wired (${h.wired})${reload} · ${h.running ? "running" : "not running"}`);
|
|
860
896
|
}
|
|
861
897
|
}
|
|
862
898
|
lines.push("");
|
|
@@ -865,19 +901,19 @@ export function renderReceiptMarkdown(model) {
|
|
|
865
901
|
const sb = model.sandboxes;
|
|
866
902
|
lines.push("## Sandboxes");
|
|
867
903
|
if (sb.backend)
|
|
868
|
-
lines.push(`Configured backend: ${sb.backend}`);
|
|
904
|
+
lines.push(`Configured backend: ${mdText(sb.backend)}`);
|
|
869
905
|
for (const s of sb.sandboxes) {
|
|
870
|
-
lines.push(`- \`${s.sandboxId}\` — ${s.backend} · ${s.status} · created ${relativeTime(s.createdAt, nowMs)}`);
|
|
906
|
+
lines.push(`- \`${mdInline(s.sandboxId)}\` — ${mdText(s.backend)} · ${mdText(s.status)} · created ${relativeTime(s.createdAt, nowMs)}`);
|
|
871
907
|
}
|
|
872
908
|
lines.push("");
|
|
873
909
|
}
|
|
874
910
|
if (model.orr) {
|
|
875
911
|
const orr = model.orr;
|
|
876
|
-
lines.push("## Operational readiness", `overall: ${orr.overall} · disposition: ${orr.disposition.replace(/_/g, " ")}${orr.targetName ? ` · target ${orr.targetName}` : ""}`);
|
|
912
|
+
lines.push("## Operational readiness", `overall: ${orr.overall} · disposition: ${orr.disposition.replace(/_/g, " ")}${orr.targetName ? ` · target ${mdText(orr.targetName)}` : ""}`);
|
|
877
913
|
if (orr.primaryFailureMode)
|
|
878
|
-
lines.push(`Primary failure mode: ${orr.primaryFailureMode}`);
|
|
914
|
+
lines.push(`Primary failure mode: ${mdText(orr.primaryFailureMode)}`);
|
|
879
915
|
if (orr.mostUrgentFix)
|
|
880
|
-
lines.push(`Most urgent fix: ${orr.mostUrgentFix}`);
|
|
916
|
+
lines.push(`Most urgent fix: ${mdText(orr.mostUrgentFix)}`);
|
|
881
917
|
lines.push(`scorecards: ${orr.scorecards.pass} pass · ${orr.scorecards.fail} fail · ${orr.scorecards.partial} partial · ${orr.scorecards.notEvaluated} n/e${orr.generatedAt ? ` · ${relativeTime(orr.generatedAt, nowMs)}` : ""}`, "");
|
|
882
918
|
}
|
|
883
919
|
if (model.showback) {
|
|
@@ -887,7 +923,7 @@ export function renderReceiptMarkdown(model) {
|
|
|
887
923
|
.sort((a, b) => (b.estimatedUsd ?? -1) - (a.estimatedUsd ?? -1))
|
|
888
924
|
.slice(0, 5);
|
|
889
925
|
for (const r of topRuns) {
|
|
890
|
-
lines.push(`- \`${r.runId}\` — ${r.steps} step${r.steps === 1 ? "" : "s"} · ${usdText(r.estimatedUsd)}`);
|
|
926
|
+
lines.push(`- \`${mdInline(r.runId)}\` — ${r.steps} step${r.steps === 1 ? "" : "s"} · ${usdText(r.estimatedUsd)}`);
|
|
891
927
|
}
|
|
892
928
|
lines.push(SHOWBACK_DISCLAIMER, "");
|
|
893
929
|
}
|