suzi-cli 0.1.24 → 0.1.25

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/CLAUDE.md CHANGED
@@ -67,7 +67,7 @@ src/
67
67
  **Config (`lib/config.ts`):**
68
68
  - Persisted at `~/.suzi/config.json`.
69
69
  - Stores: `accessToken`, `apiUrl`, `webUrl`, `user`, `activeAccountId`, `accounts`, `preferences`.
70
- - Default API: `https://api-3ihwe.ondigitalocean.app`, default web: `https://v2.suzi.trade`.
70
+ - Default API: `https://api-3ihwe.ondigitalocean.app`, default web: `https://new.suzi.trade`.
71
71
 
72
72
  **Command Pattern:**
73
73
  Each command file follows the same structure:
@@ -15,6 +15,9 @@ interface DeleteAgentOptions {
15
15
  json?: boolean;
16
16
  force?: boolean;
17
17
  }
18
+ interface AgentConfigCommandOptions {
19
+ json?: boolean;
20
+ }
18
21
  export declare function registerAgentCommand(program: Command): void;
19
22
  export declare function listAgentsCommand(opts?: {
20
23
  json?: boolean;
@@ -22,6 +25,8 @@ export declare function listAgentsCommand(opts?: {
22
25
  export declare function viewAgentCommand(idOrName?: string, opts?: {
23
26
  json?: boolean;
24
27
  }): Promise<void>;
28
+ export declare function getAgentConfigCommand(idOrName?: string, opts?: AgentConfigCommandOptions): Promise<void>;
29
+ export declare function setAgentConfigCommand(idOrName?: string, updatesArgs?: string[], opts?: AgentConfigCommandOptions): Promise<void>;
25
30
  export declare function deployAgentCommand(file?: string, opts?: DeployAgentOptions): Promise<void>;
26
31
  export declare function validateAgentCommand(file?: string, opts?: {
27
32
  json?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.registerAgentCommand = registerAgentCommand;
40
40
  exports.listAgentsCommand = listAgentsCommand;
41
41
  exports.viewAgentCommand = viewAgentCommand;
42
+ exports.getAgentConfigCommand = getAgentConfigCommand;
43
+ exports.setAgentConfigCommand = setAgentConfigCommand;
42
44
  exports.deployAgentCommand = deployAgentCommand;
43
45
  exports.validateAgentCommand = validateAgentCommand;
44
46
  exports.activateAgentCommand = activateAgentCommand;
@@ -62,6 +64,7 @@ const inquirer_1 = __importDefault(require("inquirer"));
62
64
  const fs_1 = __importDefault(require("fs"));
63
65
  const path_1 = __importDefault(require("path"));
64
66
  const api_1 = require("../lib/api");
67
+ const agent_config_1 = require("../lib/agent-config");
65
68
  const api_errors_1 = require("../lib/api-errors");
66
69
  const ui_1 = require("../utils/ui");
67
70
  const memory_1 = require("../lib/memory");
@@ -129,6 +132,24 @@ function registerAgentCommand(program) {
129
132
  .action(async (id, opts) => {
130
133
  await viewAgentCommand(id, opts);
131
134
  });
135
+ const configCommand = agent
136
+ .command('config')
137
+ .description('View and update agent config');
138
+ configCommand
139
+ .command('get [id]')
140
+ .description('Get config for an agent')
141
+ .option('--json', 'Output as JSON')
142
+ .action(async (id, opts) => {
143
+ await getAgentConfigCommand(id, opts);
144
+ });
145
+ configCommand
146
+ .command('set [args...]')
147
+ .description('Set one or more config values using key=value pairs')
148
+ .option('--json', 'Output as JSON')
149
+ .action(async (args, opts) => {
150
+ const parsed = (0, agent_config_1.splitConfigSetArgs)(args || []);
151
+ await setAgentConfigCommand(parsed.idOrName, parsed.updates, opts);
152
+ });
132
153
  // suzi agents deploy [file]
133
154
  agent
134
155
  .command('deploy [file]')
@@ -415,6 +436,357 @@ async function viewAgentCommand(idOrName, opts) {
415
436
  console.log();
416
437
  (0, ui_1.divider)();
417
438
  }
439
+ function formatConfigValue(value) {
440
+ if (value === undefined)
441
+ return '<unset>';
442
+ if (typeof value === 'string')
443
+ return JSON.stringify(value);
444
+ if (typeof value === 'number' || typeof value === 'boolean')
445
+ return String(value);
446
+ return JSON.stringify(value);
447
+ }
448
+ function formatConfigSource(source) {
449
+ switch (source) {
450
+ case 'saved':
451
+ return chalk_1.default.green('saved');
452
+ case 'default':
453
+ return chalk_1.default.yellow('default');
454
+ default:
455
+ return ui_1.colors.muted('unset');
456
+ }
457
+ }
458
+ function formatRequirementTarget(requirement, schema, values) {
459
+ const resolved = (0, agent_config_1.resolveRequirementAmount)(requirement.minAmount, schema, values);
460
+ const token = requirement.token ||
461
+ (requirement.type === 'svm_native_balance' ? 'SOL' : '');
462
+ const minAmount = requirement.minAmount;
463
+ const multiply = typeof minAmount === 'object' &&
464
+ minAmount !== null &&
465
+ 'multiply' in minAmount &&
466
+ typeof minAmount.multiply === 'number'
467
+ ? minAmount.multiply
468
+ : undefined;
469
+ if (resolved.value !== undefined) {
470
+ return `>= ${resolved.value} ${token}`.trim();
471
+ }
472
+ if (resolved.ref) {
473
+ return `${resolved.ref}${multiply !== undefined ? ` * ${multiply}` : ''} (${ui_1.colors.muted('unresolved')})`;
474
+ }
475
+ return ui_1.colors.muted('unresolved');
476
+ }
477
+ function printAgentConfig(agent, configData) {
478
+ (0, ui_1.header)(`${agent.title || 'Untitled Agent'} Config`);
479
+ console.log();
480
+ (0, ui_1.label)('ID', agent.id);
481
+ if (agent.status) {
482
+ (0, ui_1.label)('Status', (0, ui_1.statusBadge)(agent.status));
483
+ }
484
+ const schemaEntries = Object.entries(configData.schema || {});
485
+ console.log();
486
+ if (schemaEntries.length === 0) {
487
+ (0, ui_1.info)('This agent has no configurable fields.');
488
+ }
489
+ else {
490
+ const table = new cli_table3_1.default({
491
+ head: [
492
+ chalk_1.default.gray('Field'),
493
+ chalk_1.default.gray('Type'),
494
+ chalk_1.default.gray('Current'),
495
+ chalk_1.default.gray('Source'),
496
+ chalk_1.default.gray('Required'),
497
+ chalk_1.default.gray('Default'),
498
+ chalk_1.default.gray('Constraints'),
499
+ ],
500
+ style: { head: [], border: ['gray'] },
501
+ wordWrap: true,
502
+ });
503
+ for (const [key, field] of schemaEntries) {
504
+ const effective = (0, agent_config_1.getEffectiveConfigValue)(key, configData.schema, configData.values);
505
+ table.push([
506
+ chalk_1.default.bold(key),
507
+ field.type,
508
+ formatConfigValue(effective.value),
509
+ formatConfigSource(effective.source),
510
+ field.required === false ? 'no' : 'yes',
511
+ field.default !== undefined ? formatConfigValue(field.default) : ui_1.colors.muted('—'),
512
+ (0, agent_config_1.describeConfigConstraints)(field) || ui_1.colors.muted('—'),
513
+ ]);
514
+ }
515
+ console.log(table.toString());
516
+ }
517
+ const requirementEntries = Object.entries(configData.activationRequirements || {});
518
+ if (requirementEntries.length > 0) {
519
+ console.log();
520
+ console.log(ui_1.colors.muted(' Activation Requirements:'));
521
+ const requirementTable = new cli_table3_1.default({
522
+ head: [
523
+ chalk_1.default.gray('Name'),
524
+ chalk_1.default.gray('Wallet'),
525
+ chalk_1.default.gray('Need'),
526
+ chalk_1.default.gray('Description'),
527
+ ],
528
+ style: { head: [], border: ['gray'] },
529
+ wordWrap: true,
530
+ });
531
+ for (const [name, requirement] of requirementEntries) {
532
+ requirementTable.push([
533
+ chalk_1.default.bold(name),
534
+ requirement.type.startsWith('evm') ? 'evm' : 'svm',
535
+ formatRequirementTarget(requirement, configData.schema, configData.values),
536
+ requirement.description || ui_1.colors.muted('—'),
537
+ ]);
538
+ }
539
+ console.log(requirementTable.toString());
540
+ }
541
+ console.log();
542
+ (0, ui_1.divider)();
543
+ }
544
+ function outputLocalConfigError(jsonMode, message) {
545
+ process.exitCode = 1;
546
+ if (jsonMode) {
547
+ (0, tty_1.outputJson)({ success: false, error: message });
548
+ }
549
+ else {
550
+ (0, ui_1.error)(message);
551
+ }
552
+ }
553
+ async function fetchAgentConfig(agentId, jsonMode) {
554
+ const spinner = (0, tty_1.createSpinner)('Loading agent config...', jsonMode);
555
+ spinner?.start();
556
+ const resp = await (0, api_1.get)(`/api/agent/${agentId}/config`);
557
+ if (!resp.ok) {
558
+ spinner?.fail();
559
+ process.exitCode = 1;
560
+ handleCliApiFailure(resp.data, {
561
+ jsonMode,
562
+ prefix: 'Failed to load config: ',
563
+ });
564
+ return null;
565
+ }
566
+ spinner?.stop();
567
+ return resp.data;
568
+ }
569
+ async function getAgentConfigCommand(idOrName, opts) {
570
+ if (!(0, ui_1.requireAuth)())
571
+ return;
572
+ const jsonMode = opts?.json || false;
573
+ const agent = await (0, agent_picker_1.fetchAndPickAgent)(idOrName, jsonMode);
574
+ if (!agent)
575
+ return;
576
+ const configData = await fetchAgentConfig(agent.id, jsonMode);
577
+ if (!configData)
578
+ return;
579
+ if (jsonMode) {
580
+ (0, tty_1.outputJson)({
581
+ success: true,
582
+ data: {
583
+ agentId: agent.id,
584
+ ...configData,
585
+ },
586
+ });
587
+ return;
588
+ }
589
+ printAgentConfig(agent, configData);
590
+ }
591
+ function printUpdatedConfigValues(updatedKeys, schema, values) {
592
+ const table = new cli_table3_1.default({
593
+ head: [
594
+ chalk_1.default.gray('Field'),
595
+ chalk_1.default.gray('Saved Value'),
596
+ chalk_1.default.gray('Type'),
597
+ ],
598
+ style: { head: [], border: ['gray'] },
599
+ });
600
+ for (const key of updatedKeys) {
601
+ table.push([
602
+ chalk_1.default.bold(key),
603
+ formatConfigValue(values[key]),
604
+ schema[key]?.type || ui_1.colors.muted('unknown'),
605
+ ]);
606
+ }
607
+ console.log(table.toString());
608
+ }
609
+ async function setAgentConfigCommand(idOrName, updatesArgs = [], opts) {
610
+ if (!(0, ui_1.requireAuth)())
611
+ return;
612
+ const jsonMode = opts?.json || false;
613
+ const agent = await (0, agent_picker_1.fetchAndPickAgent)(idOrName, jsonMode);
614
+ if (!agent)
615
+ return;
616
+ const configData = await fetchAgentConfig(agent.id, jsonMode);
617
+ if (!configData)
618
+ return;
619
+ const schemaEntries = Object.entries(configData.schema || {});
620
+ if (schemaEntries.length === 0) {
621
+ outputLocalConfigError(jsonMode, 'This agent has no configurable fields.');
622
+ return;
623
+ }
624
+ let updates;
625
+ try {
626
+ updates = (0, agent_config_1.parseConfigUpdateArgs)(updatesArgs, configData.schema);
627
+ }
628
+ catch (err) {
629
+ const message = err instanceof Error ? err.message : String(err);
630
+ outputLocalConfigError(jsonMode, message);
631
+ return;
632
+ }
633
+ const updatedKeys = Object.keys(updates);
634
+ const startedActive = agent.status === 'active';
635
+ let deactivatedForUpdate = false;
636
+ if (startedActive) {
637
+ if (jsonMode || !(0, tty_1.shouldUseInteractive)()) {
638
+ outputLocalConfigError(jsonMode, 'Cannot update config for an active agent in non-interactive mode. Deactivate the agent first.');
639
+ return;
640
+ }
641
+ const answers = await inquirer_1.default.prompt([
642
+ {
643
+ type: 'confirm',
644
+ name: 'confirm',
645
+ message: `Agent "${agent.title || 'Untitled'}" is active. Deactivate, update config, and reactivate it?`,
646
+ default: false,
647
+ },
648
+ ]);
649
+ if (!answers.confirm) {
650
+ (0, ui_1.info)('Cancelled.');
651
+ return;
652
+ }
653
+ const deactivateSpinner = (0, tty_1.createSpinner)('Deactivating agent...', jsonMode);
654
+ deactivateSpinner?.start();
655
+ const deactivateResp = await (0, api_1.post)(`/api/agent/${agent.id}/deactivate`);
656
+ if (!deactivateResp.ok) {
657
+ deactivateSpinner?.fail();
658
+ handleCliApiFailure(deactivateResp.data, {
659
+ jsonMode,
660
+ prefix: 'Failed to deactivate before config update: ',
661
+ });
662
+ process.exitCode = 1;
663
+ return;
664
+ }
665
+ deactivateSpinner?.succeed();
666
+ deactivatedForUpdate = true;
667
+ }
668
+ const updateSpinner = (0, tty_1.createSpinner)('Updating config...', jsonMode);
669
+ updateSpinner?.start();
670
+ const updateResp = await (0, api_1.patch)(`/api/agent/${agent.id}/config`, { values: updates });
671
+ if (!updateResp.ok) {
672
+ updateSpinner?.fail();
673
+ const patchError = (0, api_errors_1.parseCliApiError)(updateResp.data);
674
+ let restoreError = null;
675
+ if (deactivatedForUpdate) {
676
+ const restoreSpinner = (0, tty_1.createSpinner)('Reactivating agent after failed update...', jsonMode);
677
+ restoreSpinner?.start();
678
+ const restoreResp = await (0, api_1.post)(`/api/agent/${agent.id}/activate`);
679
+ if (!restoreResp.ok) {
680
+ restoreSpinner?.fail();
681
+ restoreError = (0, api_errors_1.parseCliApiError)(restoreResp.data);
682
+ }
683
+ else {
684
+ restoreSpinner?.succeed();
685
+ }
686
+ }
687
+ process.exitCode = 1;
688
+ if (jsonMode) {
689
+ (0, tty_1.outputJson)({
690
+ success: false,
691
+ error: restoreError
692
+ ? `${patchError.summary}. Agent could not be reactivated after the failed update.`
693
+ : patchError.summary,
694
+ data: {
695
+ agentId: agent.id,
696
+ updatedKeys,
697
+ configUpdated: false,
698
+ reactivated: deactivatedForUpdate && !restoreError,
699
+ patchError: {
700
+ summary: patchError.summary,
701
+ error: patchError.raw,
702
+ },
703
+ ...(restoreError && {
704
+ reactivationError: {
705
+ summary: restoreError.summary,
706
+ error: restoreError.raw,
707
+ },
708
+ }),
709
+ },
710
+ });
711
+ return;
712
+ }
713
+ (0, ui_1.error)(`Failed to update config: ${patchError.summary}`);
714
+ if (patchError.issues.length > 0) {
715
+ printCliApiIssues(patchError.issues);
716
+ }
717
+ else if (patchError.detailsText) {
718
+ console.log(ui_1.colors.muted(` ${patchError.detailsText}`));
719
+ }
720
+ if (restoreError) {
721
+ (0, ui_1.warn)(`Agent could not be reactivated after the failed update: ${restoreError.summary}`);
722
+ if (restoreError.issues.length > 0) {
723
+ printCliApiIssues(restoreError.issues, ' Reactivation issues:');
724
+ }
725
+ else if (restoreError.detailsText) {
726
+ console.log(ui_1.colors.muted(` ${restoreError.detailsText}`));
727
+ }
728
+ }
729
+ else if (deactivatedForUpdate) {
730
+ (0, ui_1.info)('Agent was reactivated after the failed config update.');
731
+ }
732
+ return;
733
+ }
734
+ updateSpinner?.succeed('Config updated!');
735
+ if (deactivatedForUpdate) {
736
+ const reactivateSpinner = (0, tty_1.createSpinner)('Reactivating agent...', jsonMode);
737
+ reactivateSpinner?.start();
738
+ const reactivateResp = await (0, api_1.post)(`/api/agent/${agent.id}/activate`);
739
+ if (!reactivateResp.ok) {
740
+ reactivateSpinner?.fail();
741
+ const activationError = (0, api_errors_1.parseCliApiError)(reactivateResp.data);
742
+ process.exitCode = 1;
743
+ if (jsonMode) {
744
+ (0, tty_1.outputJson)({
745
+ success: false,
746
+ error: `Config updated, but reactivation failed: ${activationError.summary}`,
747
+ data: {
748
+ agentId: agent.id,
749
+ updatedKeys,
750
+ values: updateResp.data.values,
751
+ configUpdated: true,
752
+ reactivated: false,
753
+ activationError: {
754
+ summary: activationError.summary,
755
+ error: activationError.raw,
756
+ },
757
+ },
758
+ });
759
+ return;
760
+ }
761
+ (0, ui_1.error)(`Config updated, but reactivation failed: ${activationError.summary}`);
762
+ if (activationError.issues.length > 0) {
763
+ printCliApiIssues(activationError.issues, ' Reactivation issues:');
764
+ }
765
+ else if (activationError.detailsText) {
766
+ console.log(ui_1.colors.muted(` ${activationError.detailsText}`));
767
+ }
768
+ console.log();
769
+ printUpdatedConfigValues(updatedKeys, configData.schema, updateResp.data.values);
770
+ return;
771
+ }
772
+ reactivateSpinner?.succeed();
773
+ }
774
+ if (jsonMode) {
775
+ (0, tty_1.outputJson)({
776
+ success: true,
777
+ data: {
778
+ agentId: agent.id,
779
+ updatedKeys,
780
+ values: updateResp.data.values,
781
+ reactivated: deactivatedForUpdate,
782
+ },
783
+ });
784
+ return;
785
+ }
786
+ (0, ui_1.success)(`Updated config for ${agent.title || agent.id}.`);
787
+ console.log();
788
+ printUpdatedConfigValues(updatedKeys, configData.schema, updateResp.data.values);
789
+ }
418
790
  async function deployAgentCommand(file, opts) {
419
791
  if (!(0, ui_1.requireAuth)())
420
792
  return;