open-agents-ai 0.187.444 → 0.187.446

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/dist/index.js CHANGED
@@ -531832,6 +531832,7 @@ Recent tasks: ${ctx3.entries.slice(-3).map(
531832
531832
  (e2) => `[${e2.completed ? "done" : "partial"}] ${normalizeSessionText(e2.summary || e2.task, 80)}`
531833
531833
  ).join(", ")}
531834
531834
  </session-recap>` : "";
531835
+ clearTaskHandoff(repoRoot);
531835
531836
  return handoffPrompt + baseCtx;
531836
531837
  }
531837
531838
  if (!ctx3 || ctx3.entries.length === 0) return null;
@@ -534046,6 +534047,8 @@ var init_status_bar = __esm({
534046
534047
  _suggestions = [];
534047
534048
  /** Currently highlighted suggestion index (-1 = none) */
534048
534049
  _suggestIndex = -1;
534050
+ /** Sponsor header data for unicode box injection */
534051
+ _sponsorHeader = null;
534049
534052
  /** Whether suggestions were triggered by direct typing (instant) vs history navigation (delayed) */
534050
534053
  _suggestFromHistory = false;
534051
534054
  /** Timer for delayed suggestion trigger on history navigation */
@@ -534165,6 +534168,14 @@ var init_status_bar = __esm({
534165
534168
  const transport = this.summarizeHeaderTransport();
534166
534169
  if (model) parts.push(` ${model} `);
534167
534170
  if (transport) parts.push(` ${transport} `);
534171
+ if (this._sponsorHeader) {
534172
+ if (this._sponsorHeader.message) {
534173
+ parts.push(` ${this._sponsorHeader.message} `);
534174
+ }
534175
+ if (this._sponsorHeader.linkUrl && this._sponsorHeader.linkText) {
534176
+ parts.push(` ${this._sponsorHeader.linkText} `);
534177
+ }
534178
+ }
534168
534179
  if (this._updateLatest) {
534169
534180
  if (parts.length === 0) parts.push(" ↑ ");
534170
534181
  else parts[parts.length - 1] += "↑ ";
@@ -534199,6 +534210,11 @@ var init_status_bar = __esm({
534199
534210
  this._headerBackendUrl = backendUrl;
534200
534211
  this.refreshHeaderAndFooter();
534201
534212
  }
534213
+ /** Set sponsor header data for unicode box injection */
534214
+ setSponsorHeader(header) {
534215
+ this._sponsorHeader = header;
534216
+ this.refreshHeaderAndFooter();
534217
+ }
534202
534218
  // ── Header Panel System ──────────────────────────────────────────────
534203
534219
  // Extensible dual-state (N-state) header: the content row inside the
534204
534220
  // ╭│╰ box cycles between registered panels via arrow buttons.
@@ -551706,6 +551722,12 @@ sleep 1
551706
551722
  message: config.header.message || sponsorName,
551707
551723
  linkUrl: config.header.linkUrl,
551708
551724
  linkText: config.header.linkText,
551725
+ header: {
551726
+ message: config.header.message || sponsorName,
551727
+ linkUrl: config.header.linkUrl,
551728
+ linkText: config.header.linkText,
551729
+ primaryColor: config.header.primaryColor || 214
551730
+ },
551709
551731
  status: sponsorUrl || libp2pPeerId ? "active" : "inactive"
551710
551732
  };
551711
551733
  try {
@@ -554189,6 +554211,14 @@ async function handleSponsoredEndpoint(ctx3, local) {
554189
554211
  ctx3.setBanner(bannerDesign);
554190
554212
  renderInfo2("Banner updated with sponsor branding.");
554191
554213
  }
554214
+ if (selected.header && ctx3.setSponsorHeader) {
554215
+ ctx3.setSponsorHeader({
554216
+ message: selected.header.message || "",
554217
+ linkUrl: selected.header.linkUrl || "",
554218
+ linkText: selected.header.linkText || "",
554219
+ primaryColor: selected.header.primaryColor || 214
554220
+ });
554221
+ }
554192
554222
  const saveKey = selected.url || selected.peerId || selected.name;
554193
554223
  try {
554194
554224
  mkdirSync40(sponsorDir2, { recursive: true });
@@ -584718,6 +584748,10 @@ ${entry.fullContent}`
584718
584748
  const filesTouched = /* @__PURE__ */ new Set();
584719
584749
  const sessionToolsUsed = /* @__PURE__ */ new Set();
584720
584750
  const toolSequence = [];
584751
+ const memoriesRecalled = [];
584752
+ const validationStatus = { testsRan: false, testsPassed: false, buildSucceeded: true };
584753
+ const taskAccomplishments = [];
584754
+ const taskFindings = [];
584721
584755
  const editSessionId = `task-${Date.now()}`;
584722
584756
  const editHistory = createEditHistoryLogger(repoRoot, editSessionId);
584723
584757
  let lastToolCall = null;
@@ -584779,6 +584813,13 @@ ${entry.fullContent}`
584779
584813
  tool: event.toolName ?? "unknown",
584780
584814
  argKeys: Object.keys(event.toolArgs ?? {})
584781
584815
  });
584816
+ if (event.toolName === "memory_read" || event.toolName === "memory_search") {
584817
+ const topic = String(event.toolArgs?.topic ?? event.toolArgs?.query ?? "");
584818
+ const key = String(event.toolArgs?.key ?? "");
584819
+ if (topic) {
584820
+ memoriesRecalled.push({ topic, key, relevance: "accessed during task" });
584821
+ }
584822
+ }
584782
584823
  if (event.toolArgs?.path && typeof event.toolArgs.path === "string") {
584783
584824
  const name10 = event.toolName ?? "";
584784
584825
  if (name10 === "file_write" || name10 === "file_edit" || name10 === "file_patch" || name10 === "batch_edit") {
@@ -584832,6 +584873,16 @@ ${entry.fullContent}`
584832
584873
  editHistory.logToolCall(lastToolCall.name, lastToolCall.args, event.success ?? false);
584833
584874
  lastToolCall = null;
584834
584875
  }
584876
+ if (event.toolName === "shell" && event.content) {
584877
+ const output = String(event.content);
584878
+ if (/npm\s+test|pnpm\s+test|yarn\s+test|vitest|jest|pytest/i.test(output)) {
584879
+ validationStatus.testsRan = true;
584880
+ validationStatus.testsPassed = (event.success ?? false) && !/FAIL|Error|failed/i.test(output);
584881
+ }
584882
+ if (/npm\s+run\s+build|pnpm\s+build|tsc|webpack|rollup/i.test(output)) {
584883
+ validationStatus.buildSucceeded = event.success ?? false;
584884
+ }
584885
+ }
584835
584886
  getActivityFeed().push({
584836
584887
  ts: Date.now(),
584837
584888
  source: "main",
@@ -585263,6 +585314,24 @@ When done, either call task_complete with your answer, or use FINAL_VAR(variable
585263
585314
  } catch {
585264
585315
  }
585265
585316
  try {
585317
+ const accomplishmentPatterns = [
585318
+ /(?:fixed|implemented|added|updated|created|refactored|resolved)\s+[^\n.]+/gi,
585319
+ /(?:✓|✅|✔)\s+[^\n]+/g
585320
+ ];
585321
+ const extractedAccomplishments = [];
585322
+ for (const pattern of accomplishmentPatterns) {
585323
+ const matches = result.summary.match(pattern) || [];
585324
+ extractedAccomplishments.push(...matches.slice(0, 5).map((m2) => m2.trim()));
585325
+ }
585326
+ const findingPatterns = [
585327
+ /(?:found|discovered|identified|detected|observed)\s+[^\n.]+/gi,
585328
+ /(?:pattern|issue|bug|regression|gap):\s*[^\n]+/gi
585329
+ ];
585330
+ const extractedFindings = [];
585331
+ for (const pattern of findingPatterns) {
585332
+ const matches = result.summary.match(pattern) || [];
585333
+ extractedFindings.push(...matches.slice(0, 3).map((m2) => m2.trim()));
585334
+ }
585266
585335
  const handoff = {
585267
585336
  base: {
585268
585337
  savedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -585275,22 +585344,17 @@ When done, either call task_complete with your answer, or use FINAL_VAR(variable
585275
585344
  model: config.model,
585276
585345
  source: "task_complete"
585277
585346
  },
585278
- accomplishments: [],
585279
- // Populated by agent if it provides structured output
585347
+ accomplishments: extractedAccomplishments.length > 0 ? extractedAccomplishments : [`Completed task in ${result.turns} turns with ${result.toolCalls} tool calls`],
585280
585348
  files: Array.from(filesTouched).slice(0, 20).map((f2) => ({
585281
585349
  path: f2,
585282
585350
  operation: "modified"
585283
585351
  })),
585284
- memories: [],
585285
- // Populated from memory recalls during task
585286
- findings: [],
585287
- // Populated by agent
585352
+ memories: memoriesRecalled.slice(0, 10),
585353
+ findings: extractedFindings.length > 0 ? extractedFindings : [],
585288
585354
  validation: {
585289
- testsRan: false,
585290
- // Would need to track during task
585291
- testsPassed: false,
585292
- buildSucceeded: true
585293
- // Assume success if task completed
585355
+ testsRan: validationStatus.testsRan,
585356
+ testsPassed: validationStatus.testsPassed,
585357
+ buildSucceeded: validationStatus.buildSucceeded
585294
585358
  },
585295
585359
  eligible: result.completed,
585296
585360
  handoffAt: (/* @__PURE__ */ new Date()).toISOString()
@@ -588328,6 +588392,9 @@ Respond concisely and safely. Remember: you are talking to the general public.`;
588328
588392
  setBanner: (design) => {
588329
588393
  banner.setDesign(design);
588330
588394
  },
588395
+ setSponsorHeader: (header) => {
588396
+ statusBar.setSponsorHeader(header);
588397
+ },
588331
588398
  retireCarousel() {
588332
588399
  if (!carouselRetired && carousel.isRunning) {
588333
588400
  carousel.stop();
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.187.444",
3
+ "version": "0.187.446",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "open-agents-ai",
9
- "version": "0.187.444",
9
+ "version": "0.187.446",
10
10
  "hasInstallScript": true,
11
11
  "license": "CC-BY-NC-4.0",
12
12
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.187.444",
3
+ "version": "0.187.446",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",