@hackerrank/astra-cli 0.1.18 → 0.1.20

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hackerrank/astra-cli",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Minimal zero-dependency AI coding agent for the HackerRank AI Gateway.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/agent.js CHANGED
@@ -105,7 +105,11 @@ export class Agent {
105
105
 
106
106
  apiMessages() {
107
107
  return this.messages
108
- .filter((m) => m.role === "system" || m.role === "user" || m.role === "assistant")
108
+ .filter(
109
+ (m) =>
110
+ (m.role === "system" || m.role === "user") ||
111
+ (m.role === "assistant" && m.content !== "")
112
+ )
109
113
  .map((m) => ({ role: m.role, content: m.content }));
110
114
  }
111
115
 
@@ -131,7 +135,7 @@ export class Agent {
131
135
  throw err;
132
136
  }
133
137
  this.lastContextTokens = usage.prompt_tokens;
134
- this.add("assistant", content, { usage });
138
+ if (content !== "") this.add("assistant", content, { usage });
135
139
 
136
140
  this.onStep({
137
141
  step: this.nSteps,
package/src/report.js CHANGED
@@ -260,7 +260,16 @@ export function buildSummary(runs) {
260
260
  export function renderReportHtml(summary) {
261
261
  const tplPath = new URL("./report.html", import.meta.url);
262
262
  const tpl = fs.readFileSync(tplPath, "utf8");
263
- const data = JSON.stringify(summary).replace(/</g, "\\u003c");
263
+ // The summary includes model trajectory text, which can contain arbitrary
264
+ // shell output. Escape HTML-sensitive characters before embedding JSON in a
265
+ // script block so a literal `</script>` cannot terminate it early.
266
+ const data = JSON.stringify(summary)
267
+ .replace(/</g, "\\u003c")
268
+ .replace(/>/g, "\\u003e")
269
+ .replace(/&/g, "\\u0026")
270
+ .replace(/[\u2028\u2029]/g, (character) =>
271
+ character === "\u2028" ? "\\u2028" : "\\u2029",
272
+ );
264
273
  if (!tpl.includes("/*__ASTRA_DATA__*/")) {
265
274
  throw new Error("src/report.html is missing the /*__ASTRA_DATA__*/ injection marker");
266
275
  }