open-agents-ai 0.71.7 → 0.71.9

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.
Files changed (2) hide show
  1. package/dist/index.js +57 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -15071,6 +15071,32 @@ are scanned for key material leaks. Payment operations use the key internally.
15071
15071
  When the user asks about expanding capabilities or connecting with other agents, suggest
15072
15072
  enabling nexus networking. Use inference_proof to benchmark and advertise capabilities.
15073
15073
 
15074
+ ## Temporal Agency \u2014 Scheduling, Reminders & Long-Horizon Tasks
15075
+
15076
+ You have 4 temporal tools for persistent, cross-session time management:
15077
+
15078
+ - scheduler: Create OS-level cron jobs that launch the agent on a schedule.
15079
+ scheduler(action='schedule', task='Run full test suite', schedule='daily')
15080
+ scheduler(action='list') \u2014 see all scheduled tasks
15081
+ Presets: 'every 5 minutes', 'every hour', 'daily', 'weekly', 'monthly', or raw cron.
15082
+
15083
+ - cron_agent: Like scheduler but with goal tracking, completion criteria, and execution history.
15084
+ cron_agent(action='create', task='Check for dependency updates', goal='Keep deps current',
15085
+ schedule='weekly', completion_criteria='No outdated packages', verify_command='npm outdated')
15086
+ Use for long-horizon autonomous workflows: periodic reviews, monitoring, updates.
15087
+
15088
+ - reminder: Leave a message for your future self across sessions.
15089
+ reminder(action='create', message='Follow up on PR review', due='in 2 hours', priority='high')
15090
+ Reminders surface automatically at agent startup. Use for deferred attention.
15091
+
15092
+ - agenda: View and manage attention directives \u2014 what to focus on across sessions.
15093
+ agenda(action='view') \u2014 see active focus items
15094
+ agenda(action='set', focus='Finish migration before Friday', priority='critical')
15095
+
15096
+ These tools use OS cron (survives process death) and persist state to .oa/ for cross-session continuity.
15097
+ Use cron_agent for recurring autonomous tasks, scheduler for simple repeating commands,
15098
+ reminder for deferred attention, and agenda for strategic focus tracking.
15099
+
15074
15100
  ## Context Efficiency
15075
15101
 
15076
15102
  - Use grep_search to find specific code instead of reading many files
@@ -38434,7 +38460,7 @@ ${emotionContext}` : `Working directory: ${repoRoot}`;
38434
38460
  if (result.completed) {
38435
38461
  renderTaskComplete(result.summary, result.turns, result.toolCalls, result.durationMs, tokens);
38436
38462
  if (onComplete)
38437
- onComplete(result.summary);
38463
+ onComplete(result.summary, { turns: result.turns, toolCalls: result.toolCalls, durationMs: result.durationMs, model: config.model });
38438
38464
  if (voice?.enabled && result.summary) {
38439
38465
  voice.speak(describeTaskComplete(result.summary, true, vLevel));
38440
38466
  }
@@ -38838,6 +38864,7 @@ Rationale: ${proposal.rationale}${provenanceNote}`;
38838
38864
  let carouselRetired = isResumed;
38839
38865
  let lastSubmittedPrompt = "";
38840
38866
  let lastCompletedSummary = "";
38867
+ let lastTaskMeta = null;
38841
38868
  let currentTaskType;
38842
38869
  let sessionFilesTouched = [];
38843
38870
  let sessionToolCallCount = 0;
@@ -40031,8 +40058,9 @@ Execute this skill now. Follow the behavioral guidance above.`;
40031
40058
  taskMemoryStore: taskMemoryStore ?? void 0,
40032
40059
  failureStore: failureStore ?? void 0,
40033
40060
  toolPatternStore: toolPatternStore ?? void 0
40034
- }, bruteForceEnabled, statusBar, handleSudoRequest, costTracker, (summary) => {
40061
+ }, bruteForceEnabled, statusBar, handleSudoRequest, costTracker, (summary, meta) => {
40035
40062
  lastCompletedSummary = summary;
40063
+ lastTaskMeta = meta ?? null;
40036
40064
  }, currentTaskType, resolvedContextWindowSize, resolvedCaps, currentStyle, deepContextEnabled, compactionSNRCallback(), emotionEngine);
40037
40065
  activeTask = task;
40038
40066
  showPrompt();
@@ -40226,8 +40254,9 @@ NEW TASK: ${fullInput}`;
40226
40254
  taskMemoryStore: taskMemoryStore ?? void 0,
40227
40255
  failureStore: failureStore ?? void 0,
40228
40256
  toolPatternStore: toolPatternStore ?? void 0
40229
- }, bruteForceEnabled, statusBar, handleSudoRequest, costTracker, (summary) => {
40257
+ }, bruteForceEnabled, statusBar, handleSudoRequest, costTracker, (summary, meta) => {
40230
40258
  lastCompletedSummary = summary;
40259
+ lastTaskMeta = meta ?? null;
40231
40260
  }, currentTaskType, resolvedContextWindowSize, resolvedCaps, currentStyle, deepContextEnabled, compactionSNRCallback(), emotionEngine);
40232
40261
  activeTask = task;
40233
40262
  showPrompt();
@@ -40292,7 +40321,31 @@ NEW TASK: ${fullInput}`;
40292
40321
  if (activeTelegramChatId && telegramBridge?.isActive && lastCompletedSummary) {
40293
40322
  const chatId = activeTelegramChatId;
40294
40323
  activeTelegramChatId = null;
40295
- telegramBridge.sendMessage(chatId, lastCompletedSummary).catch(() => {
40324
+ const parts = [];
40325
+ parts.push(lastCompletedSummary);
40326
+ if (lastTaskMeta) {
40327
+ const dur = lastTaskMeta.durationMs < 6e4 ? `${(lastTaskMeta.durationMs / 1e3).toFixed(1)}s` : `${Math.floor(lastTaskMeta.durationMs / 6e4)}m ${Math.floor(lastTaskMeta.durationMs % 6e4 / 1e3)}s`;
40328
+ parts.push(`
40329
+ \u{1F4CA} ${lastTaskMeta.turns} turns, ${lastTaskMeta.toolCalls} tool calls in ${dur} (${lastTaskMeta.model})`);
40330
+ }
40331
+ if (sessionFilesTouched.length > 0) {
40332
+ const fileList = sessionFilesTouched.length <= 5 ? sessionFilesTouched.map((f) => ` \u2022 ${f}`).join("\n") : sessionFilesTouched.slice(0, 5).map((f) => ` \u2022 ${f}`).join("\n") + `
40333
+ ... +${sessionFilesTouched.length - 5} more`;
40334
+ parts.push(`
40335
+ \u{1F4C1} Files modified:
40336
+ ${fileList}`);
40337
+ }
40338
+ if (emotionEngine) {
40339
+ try {
40340
+ const emotion = emotionEngine.getState();
40341
+ if (emotion.label && emotion.label !== "neutral") {
40342
+ parts.push(`
40343
+ ${emotion.emoji} ${emotion.label}`);
40344
+ }
40345
+ } catch {
40346
+ }
40347
+ }
40348
+ telegramBridge.sendMessage(chatId, parts.join("")).catch(() => {
40296
40349
  });
40297
40350
  } else {
40298
40351
  activeTelegramChatId = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.71.7",
3
+ "version": "0.71.9",
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",