@openagents-org/agent-launcher 0.2.126 → 0.2.128

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": "@openagents-org/agent-launcher",
3
- "version": "0.2.126",
3
+ "version": "0.2.128",
4
4
  "description": "OpenAgents Launcher — install, configure, and run AI coding agents from your terminal",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -330,6 +330,14 @@ class BaseAdapter {
330
330
  const msgId = msg.id || msg.messageId;
331
331
  if (msgId && this._processedIds.has(msgId)) continue;
332
332
  if (msg.messageType === 'status') continue;
333
+ // Handle queue cancellation signals from frontend
334
+ if (msg.messageType === 'queue_cancel') {
335
+ if (msgId) this._processedIds.add(msgId);
336
+ const channel = msg.sessionId || this.channelName || 'general';
337
+ const queueId = msg.metadata?.queue_id || (msg.content || '').replace('__queue_cancel:', '');
338
+ if (queueId) this._cancelQueuedMessage(channel, queueId);
339
+ continue;
340
+ }
333
341
  incoming.push(msg);
334
342
  }
335
343
 
@@ -372,9 +380,14 @@ class BaseAdapter {
372
380
 
373
381
  if (this._channelBusy.has(channel)) {
374
382
  if (!this._channelQueues[channel]) this._channelQueues[channel] = [];
383
+ const queueId = `q-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
384
+ msg._queueId = queueId;
375
385
  this._channelQueues[channel].push(msg);
376
386
  try {
377
- await this.sendStatus(channel, 'message queued — will process after current task');
387
+ await this.sendStatus(channel, 'message queued — will process after current task', {
388
+ queued_message: (msg.content || '').slice(0, 200),
389
+ queue_id: queueId,
390
+ });
378
391
  } catch {}
379
392
  return;
380
393
  }
@@ -384,6 +397,16 @@ class BaseAdapter {
384
397
  this._wakeControlPoller();
385
398
  }
386
399
 
400
+ _cancelQueuedMessage(channel, queueId) {
401
+ const queue = this._channelQueues[channel];
402
+ if (!queue) return false;
403
+ const idx = queue.findIndex((m) => m._queueId === queueId);
404
+ if (idx === -1) return false;
405
+ queue.splice(idx, 1);
406
+ this._log(`Cancelled queued message ${queueId} in ${channel}`);
407
+ return true;
408
+ }
409
+
387
410
  async _channelWorker(channel, msg) {
388
411
  this._channelBusy.add(channel);
389
412
  try {
@@ -435,13 +458,13 @@ class BaseAdapter {
435
458
  // Message helpers
436
459
  // ------------------------------------------------------------------
437
460
 
438
- async sendStatus(channel, content) {
461
+ async sendStatus(channel, content, extraMeta) {
439
462
  try {
440
463
  await this.client.sendMessage(this.workspaceId, channel, this.token, content, {
441
464
  senderType: 'agent',
442
465
  senderName: this.agentName,
443
466
  messageType: 'status',
444
- metadata: { agent_mode: this._mode },
467
+ metadata: { agent_mode: this._mode, ...extraMeta },
445
468
  sessionId: this._sessionId,
446
469
  });
447
470
  } catch (e) {
@@ -390,7 +390,7 @@ class ClaudeAdapter extends BaseAdapter {
390
390
  const cmd = [claudeBin, '-p', prompt, '--output-format', 'stream-json', '--verbose'];
391
391
 
392
392
  cmd.push('--append-system-prompt', systemPrompt);
393
- cmd.push('--disallowedTools', 'AskUserQuestion');
393
+ cmd.push('--disallowedTools', 'AskUserQuestion', 'CronCreate', 'CronDelete', 'CronList', 'ScheduleWakeup');
394
394
 
395
395
  // Resume existing conversation (skipped on retry after stale session)
396
396
  const sessionId = this._channelSessions[channelName];
@@ -345,6 +345,13 @@ function buildClaudeSystemPrompt({ agentName, workspaceId, channelName, mode = '
345
345
  'The to-do list lets the user track your progress in real time.\n'
346
346
  );
347
347
 
348
+ parts.push(
349
+ '\nIMPORTANT: Do NOT use built-in scheduling tools (CronCreate, CronDelete, ' +
350
+ 'CronList, ScheduleWakeup). For timers, routines, and recurring tasks, ' +
351
+ 'ALWAYS use the workspace REST API (curl commands in your skill instructions). ' +
352
+ 'Built-in scheduling is local-only and won\'t appear in the workspace.\n'
353
+ );
354
+
348
355
  return parts.join('\n');
349
356
  }
350
357