a2acalling 0.6.48 → 0.6.50

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/bin/cli.js CHANGED
@@ -37,7 +37,8 @@ const ONBOARDING_EXEMPT = new Set([
37
37
  'dashboard',
38
38
  'server',
39
39
  'setup',
40
- 'install'
40
+ 'install',
41
+ 'skills'
41
42
  ]);
42
43
 
43
44
  function isOnboarded() {
@@ -710,6 +711,8 @@ const commands = {
710
711
 
711
712
  // Get objectives from disclosure
712
713
  const objectives = tierTopics.objectives || [];
714
+ const timeoutMsRaw = args.flags['timeout-ms'] || args.flags.timeout_ms;
715
+ const timeoutMs = timeoutMsRaw ? Number.parseInt(String(timeoutMsRaw), 10) : null;
713
716
 
714
717
  const { token, record } = store.create({
715
718
  name: args.flags.name || args.flags.n || 'unnamed',
@@ -720,7 +723,8 @@ const commands = {
720
723
  notify: args.flags.notify || 'all',
721
724
  maxCalls,
722
725
  allowedTopics,
723
- allowedGoals: objectives.map(o => o.objective || o)
726
+ allowedGoals: objectives.map(o => o.objective || o),
727
+ timeoutMs
724
728
  });
725
729
 
726
730
  const resolvedHost = await resolveInviteHostname();
@@ -759,6 +763,7 @@ const commands = {
759
763
  console.log(`Disclosure: ${record.disclosure}`);
760
764
  console.log(`Notify: ${record.notify}`);
761
765
  console.log(`Max calls: ${record.max_calls || 'unlimited'}`);
766
+ if (record.timeout_ms) console.log(`Turn timeout: ${record.timeout_ms}ms`);
762
767
  if (linkContact) console.log(`Linked to: ${linkContact}`);
763
768
  console.log(`\nTo revoke: a2a revoke ${record.id}`);
764
769
  console.log(`\n${'─'.repeat(50)}`);
@@ -1355,11 +1360,15 @@ a2a add "${inviteUrl}" "${ownerText || 'friend'}" && a2a call "${ownerText || 'f
1355
1360
 
1356
1361
  // Build owner context from config for summarizer
1357
1362
  let ownerContext = {};
1363
+ let configTurnTimeoutMs = null;
1358
1364
  try {
1359
1365
  const { A2AConfig } = require('../src/lib/config');
1360
1366
  const config = new A2AConfig();
1361
1367
  const configAll = config.getAll();
1362
1368
  const tierGoals = configAll.tiers?.public?.goals || [];
1369
+ configTurnTimeoutMs = configAll.defaults?.turnTimeoutMs
1370
+ || configAll.defaults?.turn_timeout_ms
1371
+ || null;
1363
1372
  ownerContext = {
1364
1373
  goals: tierGoals,
1365
1374
  agentName: agentContext.name,
@@ -1378,6 +1387,7 @@ a2a add "${inviteUrl}" "${ownerText || 'friend'}" && a2a call "${ownerText || 'f
1378
1387
  disclosure,
1379
1388
  minTurns,
1380
1389
  maxTurns,
1390
+ configTurnTimeoutMs,
1381
1391
  ownerContext,
1382
1392
  onTurn: (info) => {
1383
1393
  const preview = info.messagePreview.length >= 80
@@ -2491,8 +2501,30 @@ a2a add "${inviteUrl}" "${ownerText || 'friend'}" && a2a call "${ownerText || 'f
2491
2501
  const { execSync } = require('child_process');
2492
2502
  const path = require('path');
2493
2503
  const pkg = require('../package.json');
2504
+ const { A2AConfig } = require('../src/lib/config');
2494
2505
  const currentVersion = pkg.version;
2495
2506
  const checkOnly = args.flags.check || args.flags.c;
2507
+ const autoMode = args.flags.auto ? String(args.flags.auto).trim().toLowerCase() : null;
2508
+
2509
+ if (autoMode) {
2510
+ const config = new A2AConfig();
2511
+ if (autoMode === 'status') {
2512
+ const au = config.getAutoUpdate ? config.getAutoUpdate() : { enabled: true, intervalMs: 3600000, allowMajor: false };
2513
+ console.log('Auto-update configuration:\n');
2514
+ console.log(` Enabled: ${au.enabled ? 'yes' : 'no'}`);
2515
+ console.log(` Interval: ${Math.floor((au.intervalMs || 3600000) / 1000)}s`);
2516
+ console.log(` Allow major updates: ${au.allowMajor ? 'yes' : 'no'}`);
2517
+ console.log(` Last known good version: ${au.lastGoodVersion || '(none)'}`);
2518
+ return;
2519
+ }
2520
+ if (autoMode === 'on' || autoMode === 'off') {
2521
+ config.setAutoUpdate({ enabled: autoMode === 'on' });
2522
+ console.log(`Auto-update ${autoMode === 'on' ? 'enabled' : 'disabled'}.`);
2523
+ return;
2524
+ }
2525
+ console.error('Invalid --auto value. Use: on | off | status');
2526
+ process.exit(1);
2527
+ }
2496
2528
 
2497
2529
  console.log(`\nšŸ“¦ A2A Update\n${'─'.repeat(50)}\n`);
2498
2530
  console.log(` Installed: v${currentVersion}`);
@@ -2603,6 +2635,46 @@ a2a add "${inviteUrl}" "${ownerText || 'friend'}" && a2a call "${ownerText || 'f
2603
2635
  return commands.quickstart(args);
2604
2636
  },
2605
2637
 
2638
+ skills: (args) => {
2639
+ const { installSkills, SKILL_FILES } = require('../scripts/install-skills');
2640
+ const check = args.flags.check || args.flags.c;
2641
+ const force = args.flags.force;
2642
+ const targetDir = process.cwd();
2643
+
2644
+ if (check) {
2645
+ console.log('A2A skills for this project:\n');
2646
+ for (const file of SKILL_FILES) {
2647
+ const destPath = path.join(targetDir, file.dest);
2648
+ const exists = fs.existsSync(destPath);
2649
+ const icon = exists ? ' \u2713' : ' \u2717';
2650
+ console.log(`${icon} ${file.dest}${exists ? ' (installed)' : ' (not installed)'}`);
2651
+ }
2652
+ console.log(`\nRun "a2a skills" to install missing files.`);
2653
+ return;
2654
+ }
2655
+
2656
+ const result = installSkills(targetDir, { force });
2657
+
2658
+ if (result.installed.length) {
2659
+ console.log(`\n Installed ${result.installed.length} A2A skill file(s):\n`);
2660
+ result.installed.forEach(f => console.log(` + ${f}`));
2661
+ }
2662
+ if (result.skipped.length) {
2663
+ console.log(`\n Skipped ${result.skipped.length} unchanged file(s)`);
2664
+ }
2665
+ if (result.errors.length) {
2666
+ console.error(`\n Errors:`);
2667
+ result.errors.forEach(e => console.error(` ! ${e.file}: ${e.error}`));
2668
+ }
2669
+
2670
+ if (result.installed.length === 0 && result.skipped.length > 0) {
2671
+ console.log('\n All skills already installed. Use --force to overwrite.\n');
2672
+ } else if (result.installed.length > 0) {
2673
+ console.log('\n Skills ready. In Claude Code, type /a2a- to see available commands.');
2674
+ console.log(' In Codex CLI, A2A instructions are in .codex/AGENTS.md\n');
2675
+ }
2676
+ },
2677
+
2606
2678
  version: () => {
2607
2679
  const pkg = require('../package.json');
2608
2680
  console.log(pkg.version);
@@ -2623,6 +2695,7 @@ Commands:
2623
2695
  --disclosure, -d Disclosure level (public, minimal, none)
2624
2696
  --notify Owner notification (all, summary, none)
2625
2697
  --max-calls Maximum invocations (default: 100)
2698
+ --timeout-ms Per-token Claude turn timeout in milliseconds
2626
2699
  --link, -l Auto-link to contact name
2627
2700
 
2628
2701
  list List active tokens
@@ -2681,12 +2754,16 @@ Server:
2681
2754
 
2682
2755
  update Update A2A to latest version (npm or git pull)
2683
2756
  --check, -c Check for updates without installing
2757
+ --auto Manage auto-update: on|off|status
2684
2758
 
2685
2759
  install Install A2A for OpenClaw
2686
2760
  setup Auto setup (gateway-aware dashboard install)
2687
2761
  uninstall Stop server and remove local config/DB
2688
2762
  --keep-config Preserve config/DB (for reinstall)
2689
2763
  --force Skip confirmation prompt
2764
+ skills Install Claude Code + Codex CLI skills
2765
+ --check, -c Show what would be installed
2766
+ --force Overwrite existing files
2690
2767
  version Show installed package version
2691
2768
 
2692
2769
  Examples: