@shield-agent/kya 0.1.41 → 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 -22
- 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'); }
|
|
@@ -796,9 +828,9 @@ export function renderReceiptMarkdown(model) {
|
|
|
796
828
|
const agg = aggregateEvents(model.events);
|
|
797
829
|
const nowMs = Date.now();
|
|
798
830
|
const lines = [
|
|
799
|
-
`# ${model.title}`,
|
|
831
|
+
`# ${mdText(model.title)}`,
|
|
800
832
|
"",
|
|
801
|
-
model.rangeLabel,
|
|
833
|
+
mdText(model.rangeLabel),
|
|
802
834
|
"",
|
|
803
835
|
`Allow ${c.allow} | Deny ${c.deny} | Hold ${c.require} | Never ${c.never}`,
|
|
804
836
|
"",
|
|
@@ -810,7 +842,7 @@ export function renderReceiptMarkdown(model) {
|
|
|
810
842
|
: (id.agentName ?? id.agentId);
|
|
811
843
|
const bits = [nameId, id.host, id.baseUrl].filter((b) => typeof b === "string" && b.trim().length > 0);
|
|
812
844
|
if (bits.length > 0) {
|
|
813
|
-
lines.push(bits.join(" · "), "");
|
|
845
|
+
lines.push(mdText(bits.join(" · ")), "");
|
|
814
846
|
}
|
|
815
847
|
}
|
|
816
848
|
const modeBits = [
|
|
@@ -826,36 +858,41 @@ export function renderReceiptMarkdown(model) {
|
|
|
826
858
|
lines.push(`Modes: ${modeBits.join(" | ") || "-"} · Planes: ${planeBits.join(" | ") || "-"}`, "");
|
|
827
859
|
}
|
|
828
860
|
if (agg.products.length >= 2) {
|
|
829
|
-
lines.push("## Products", ...agg.products.map((p) => `- ${p.label} × ${p.count}`), "");
|
|
861
|
+
lines.push("## Products", ...agg.products.map((p) => `- ${mdText(p.label)} × ${p.count}`), "");
|
|
830
862
|
}
|
|
831
863
|
lines.push("## Feed", ...[...model.events]
|
|
832
864
|
.sort((a, b) => b.ts.localeCompare(a.ts))
|
|
833
865
|
.flatMap((e) => {
|
|
834
|
-
const sum = e.summary?.trim() ? ` - ${e.summary.trim()}` : "";
|
|
835
|
-
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)}`;
|
|
836
868
|
if (!e.diffPreview?.trim())
|
|
837
869
|
return [head];
|
|
838
|
-
|
|
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, ""];
|
|
839
876
|
}), "");
|
|
840
877
|
if (agg.sessions.length > 0) {
|
|
841
|
-
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)}`), "");
|
|
842
879
|
}
|
|
843
880
|
if (agg.reasons.length > 0) {
|
|
844
|
-
lines.push("## Reasons", ...agg.reasons.map((r) => `- ${r.label} × ${r.count}`), "");
|
|
881
|
+
lines.push("## Reasons", ...agg.reasons.map((r) => `- ${mdText(r.label)} × ${r.count}`), "");
|
|
845
882
|
}
|
|
846
883
|
const hosts = model.wiredHosts ?? [];
|
|
847
884
|
if (hosts.some((h) => h.wired !== "none")) {
|
|
848
885
|
lines.push("## Wired hosts");
|
|
849
886
|
for (const h of hosts) {
|
|
850
887
|
if (h.recipeOnly) {
|
|
851
|
-
lines.push(`- ${h.label} — manual setup (docs recipe)`);
|
|
888
|
+
lines.push(`- ${mdText(h.label)} — manual setup (docs recipe)`);
|
|
852
889
|
}
|
|
853
890
|
else if (h.wired === "none") {
|
|
854
|
-
lines.push(`- ${h.label} — not wired`);
|
|
891
|
+
lines.push(`- ${mdText(h.label)} — not wired`);
|
|
855
892
|
}
|
|
856
893
|
else {
|
|
857
|
-
const reload = h.reload ? ` · ${h.reload.reload}` : "";
|
|
858
|
-
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"}`);
|
|
859
896
|
}
|
|
860
897
|
}
|
|
861
898
|
lines.push("");
|
|
@@ -864,19 +901,19 @@ export function renderReceiptMarkdown(model) {
|
|
|
864
901
|
const sb = model.sandboxes;
|
|
865
902
|
lines.push("## Sandboxes");
|
|
866
903
|
if (sb.backend)
|
|
867
|
-
lines.push(`Configured backend: ${sb.backend}`);
|
|
904
|
+
lines.push(`Configured backend: ${mdText(sb.backend)}`);
|
|
868
905
|
for (const s of sb.sandboxes) {
|
|
869
|
-
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)}`);
|
|
870
907
|
}
|
|
871
908
|
lines.push("");
|
|
872
909
|
}
|
|
873
910
|
if (model.orr) {
|
|
874
911
|
const orr = model.orr;
|
|
875
|
-
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)}` : ""}`);
|
|
876
913
|
if (orr.primaryFailureMode)
|
|
877
|
-
lines.push(`Primary failure mode: ${orr.primaryFailureMode}`);
|
|
914
|
+
lines.push(`Primary failure mode: ${mdText(orr.primaryFailureMode)}`);
|
|
878
915
|
if (orr.mostUrgentFix)
|
|
879
|
-
lines.push(`Most urgent fix: ${orr.mostUrgentFix}`);
|
|
916
|
+
lines.push(`Most urgent fix: ${mdText(orr.mostUrgentFix)}`);
|
|
880
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)}` : ""}`, "");
|
|
881
918
|
}
|
|
882
919
|
if (model.showback) {
|
|
@@ -886,7 +923,7 @@ export function renderReceiptMarkdown(model) {
|
|
|
886
923
|
.sort((a, b) => (b.estimatedUsd ?? -1) - (a.estimatedUsd ?? -1))
|
|
887
924
|
.slice(0, 5);
|
|
888
925
|
for (const r of topRuns) {
|
|
889
|
-
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)}`);
|
|
890
927
|
}
|
|
891
928
|
lines.push(SHOWBACK_DISCLAIMER, "");
|
|
892
929
|
}
|