@otonix/cli 1.2.1 → 1.4.0
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/README.md +42 -0
- package/dist/cli.js +492 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -64,6 +64,22 @@ otonix log "Trade executed BTC/USDC" --category trading
|
|
|
64
64
|
| `otonix sandboxes` | List VPS sandboxes |
|
|
65
65
|
| `otonix domains` | List registered domains |
|
|
66
66
|
|
|
67
|
+
### Credits
|
|
68
|
+
|
|
69
|
+
| Command | Description |
|
|
70
|
+
|---------|-------------|
|
|
71
|
+
| `otonix credits [agentId]` | Show agent credit balance |
|
|
72
|
+
| `otonix credits:transfer` | Transfer credits between agents |
|
|
73
|
+
| `otonix credits:history [agentId]` | Show credit transaction history |
|
|
74
|
+
|
|
75
|
+
### Templates
|
|
76
|
+
|
|
77
|
+
| Command | Description |
|
|
78
|
+
|---------|-------------|
|
|
79
|
+
| `otonix templates` | List all available agent templates |
|
|
80
|
+
| `otonix templates:info <slug>` | Show template details by slug |
|
|
81
|
+
| `otonix templates:deploy` | Deploy an agent from a template |
|
|
82
|
+
|
|
67
83
|
### Platform
|
|
68
84
|
|
|
69
85
|
| Command | Description |
|
|
@@ -147,6 +163,32 @@ otonix actions --limit 50
|
|
|
147
163
|
|--------|---------|-------------|
|
|
148
164
|
| `--limit` | `20` | Number of actions to show |
|
|
149
165
|
|
|
166
|
+
### `otonix credits:transfer`
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
otonix credits:transfer --from <agentId> --to <agentId> --amount 10 --desc "Payment"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
| Option | Default | Description |
|
|
173
|
+
|--------|---------|-------------|
|
|
174
|
+
| `--from` | (interactive) | Source agent ID |
|
|
175
|
+
| `--to` | (interactive) | Destination agent ID |
|
|
176
|
+
| `--amount` | (interactive) | Amount in USDC |
|
|
177
|
+
| `--desc` | — | Transfer description |
|
|
178
|
+
|
|
179
|
+
### `otonix templates:deploy`
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
otonix templates:deploy --template trading-bot --name my-trader --vps 10.0.1.1 --wallet 0x...
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
| Option | Default | Description |
|
|
186
|
+
|--------|---------|-------------|
|
|
187
|
+
| `--template` | (interactive) | Template slug |
|
|
188
|
+
| `--name` | (interactive) | Agent name |
|
|
189
|
+
| `--vps` | — | VPS IP address |
|
|
190
|
+
| `--wallet` | — | Wallet address |
|
|
191
|
+
|
|
150
192
|
### `otonix llm:chat`
|
|
151
193
|
|
|
152
194
|
```bash
|
package/dist/cli.js
CHANGED
|
@@ -28,7 +28,7 @@ var import_sdk = require("@otonix/sdk");
|
|
|
28
28
|
var fs = __toESM(require("fs"));
|
|
29
29
|
var path = __toESM(require("path"));
|
|
30
30
|
var readline = __toESM(require("readline"));
|
|
31
|
-
var VERSION = "1.
|
|
31
|
+
var VERSION = "1.4.0";
|
|
32
32
|
var CONFIG_DIR = path.join(process.env.HOME || "~", ".otonix");
|
|
33
33
|
var CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
34
34
|
function loadConfig() {
|
|
@@ -106,8 +106,26 @@ var HELP = `
|
|
|
106
106
|
domains List registered domains
|
|
107
107
|
sandboxes List VPS sandboxes
|
|
108
108
|
engine Show autonomic engine status
|
|
109
|
+
credits <agentId> Show agent credit balance
|
|
110
|
+
credits:transfer Transfer credits between agents
|
|
111
|
+
credits:history <id> Show credit transaction history
|
|
112
|
+
templates List available agent templates
|
|
113
|
+
templates:info <s> Show template details by slug
|
|
114
|
+
templates:deploy Deploy an agent from a template
|
|
109
115
|
marketplace List marketplace services
|
|
110
116
|
x402 Show x402 payment config
|
|
117
|
+
bv7x:promote <id> Promote an agent to mothership
|
|
118
|
+
bv7x:spawn Spawn a satellite from a BV-7X template
|
|
119
|
+
bv7x:satellites <id> List satellites of a mothership
|
|
120
|
+
bv7x:destroy <id> Destroy (terminate) a satellite
|
|
121
|
+
bv7x:report <id> Send a satellite data report
|
|
122
|
+
bv7x:fleet Show full BV-7X fleet overview
|
|
123
|
+
webhook:create Create a new webhook endpoint
|
|
124
|
+
webhook:list List registered webhooks
|
|
125
|
+
webhook:delete <id> Delete a webhook
|
|
126
|
+
webhook:test <id> Send a test delivery to a webhook
|
|
127
|
+
webhook:deliveries Show webhook delivery history
|
|
128
|
+
webhook:events List all available webhook events
|
|
111
129
|
llm:init <key> Configure Bankr LLM Gateway API key
|
|
112
130
|
llm:models List available LLM models
|
|
113
131
|
llm:chat <prompt> Send a chat completion request
|
|
@@ -471,6 +489,177 @@ async function cmdMarketplace() {
|
|
|
471
489
|
Use 'curl https://app.otonix.tech/api/marketplace/services/<id>' for details.
|
|
472
490
|
`);
|
|
473
491
|
}
|
|
492
|
+
async function cmdCredits(agentId) {
|
|
493
|
+
const client = getClient();
|
|
494
|
+
const config = loadConfig();
|
|
495
|
+
const id = agentId || config.agentId;
|
|
496
|
+
if (!id) {
|
|
497
|
+
console.error(" Usage: otonix credits <agentId> (or register an agent first)");
|
|
498
|
+
process.exit(1);
|
|
499
|
+
}
|
|
500
|
+
const balance = await client.getCreditBalance(id);
|
|
501
|
+
console.log(`
|
|
502
|
+
Agent Credit Balance:`);
|
|
503
|
+
console.log(` Agent: ${balance.name}`);
|
|
504
|
+
console.log(` Credits: $${balance.credits.toFixed(2)}`);
|
|
505
|
+
console.log(` Tier: ${balance.survivalTier}
|
|
506
|
+
`);
|
|
507
|
+
}
|
|
508
|
+
async function cmdCreditsTransfer(args) {
|
|
509
|
+
const client = getClient();
|
|
510
|
+
let fromId = "";
|
|
511
|
+
let toId = "";
|
|
512
|
+
let amount = 0;
|
|
513
|
+
let desc = "";
|
|
514
|
+
for (let i = 0; i < args.length; i++) {
|
|
515
|
+
if (args[i] === "--from" && args[i + 1]) fromId = args[++i];
|
|
516
|
+
else if (args[i] === "--to" && args[i + 1]) toId = args[++i];
|
|
517
|
+
else if (args[i] === "--amount" && args[i + 1]) amount = parseFloat(args[++i]);
|
|
518
|
+
else if (args[i] === "--desc" && args[i + 1]) desc = args[++i];
|
|
519
|
+
}
|
|
520
|
+
if (!fromId) fromId = await prompt(" From Agent ID: ");
|
|
521
|
+
if (!toId) toId = await prompt(" To Agent ID: ");
|
|
522
|
+
if (!amount) {
|
|
523
|
+
const amtStr = await prompt(" Amount (USDC): ");
|
|
524
|
+
amount = parseFloat(amtStr);
|
|
525
|
+
}
|
|
526
|
+
if (!fromId || !toId || !amount || amount <= 0) {
|
|
527
|
+
console.error(" Error: --from, --to, and --amount (> 0) are required.");
|
|
528
|
+
process.exit(1);
|
|
529
|
+
}
|
|
530
|
+
try {
|
|
531
|
+
const result = await client.transferCredits({
|
|
532
|
+
fromAgentId: fromId,
|
|
533
|
+
toAgentId: toId,
|
|
534
|
+
amount,
|
|
535
|
+
description: desc || void 0
|
|
536
|
+
});
|
|
537
|
+
if (result.success) {
|
|
538
|
+
console.log(`
|
|
539
|
+
Transfer Successful:`);
|
|
540
|
+
console.log(` Amount: $${result.transferred.toFixed(2)} USDC`);
|
|
541
|
+
console.log(` From: ${result.from}`);
|
|
542
|
+
console.log(` To: ${result.to}
|
|
543
|
+
`);
|
|
544
|
+
} else {
|
|
545
|
+
console.error(" Transfer failed.");
|
|
546
|
+
}
|
|
547
|
+
} catch (err) {
|
|
548
|
+
console.error(` Error: ${err.message}`);
|
|
549
|
+
process.exit(1);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
async function cmdCreditsHistory(agentId) {
|
|
553
|
+
const client = getClient();
|
|
554
|
+
const config = loadConfig();
|
|
555
|
+
const id = agentId || config.agentId;
|
|
556
|
+
if (!id) {
|
|
557
|
+
console.error(" Usage: otonix credits:history <agentId>");
|
|
558
|
+
process.exit(1);
|
|
559
|
+
}
|
|
560
|
+
const history = await client.getCreditHistory(id);
|
|
561
|
+
if (!history.length) {
|
|
562
|
+
console.log("\n No credit transactions found.\n");
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
console.log(`
|
|
566
|
+
Credit History (${history.length} transactions):
|
|
567
|
+
`);
|
|
568
|
+
printTable(
|
|
569
|
+
history.map((tx) => ({
|
|
570
|
+
Type: tx.type,
|
|
571
|
+
Amount: `${tx.type === "credit" ? "+" : "-"}$${Math.abs(tx.amount).toFixed(2)}`,
|
|
572
|
+
Description: (tx.description || "\u2014").slice(0, 50),
|
|
573
|
+
Status: tx.status,
|
|
574
|
+
Date: new Date(tx.createdAt).toLocaleDateString()
|
|
575
|
+
}))
|
|
576
|
+
);
|
|
577
|
+
console.log();
|
|
578
|
+
}
|
|
579
|
+
async function cmdTemplates() {
|
|
580
|
+
const client = getClient();
|
|
581
|
+
const templates = await client.listTemplates();
|
|
582
|
+
if (!templates.length) {
|
|
583
|
+
console.log("\n No templates available.\n");
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
console.log(`
|
|
587
|
+
Agent Templates (${templates.length}):
|
|
588
|
+
`);
|
|
589
|
+
printTable(
|
|
590
|
+
templates.map((t) => ({
|
|
591
|
+
Slug: t.slug,
|
|
592
|
+
Name: t.name,
|
|
593
|
+
Category: t.category,
|
|
594
|
+
Model: t.model,
|
|
595
|
+
Cost: `$${t.estimatedCost.toFixed(2)}/day`,
|
|
596
|
+
Features: t.features?.length || 0
|
|
597
|
+
}))
|
|
598
|
+
);
|
|
599
|
+
console.log();
|
|
600
|
+
}
|
|
601
|
+
async function cmdTemplatesInfo(slug) {
|
|
602
|
+
if (!slug) {
|
|
603
|
+
console.error(" Usage: otonix templates:info <slug>");
|
|
604
|
+
process.exit(1);
|
|
605
|
+
}
|
|
606
|
+
const client = getClient();
|
|
607
|
+
const template = await client.getTemplate(slug);
|
|
608
|
+
console.log(`
|
|
609
|
+
Template: ${template.name}`);
|
|
610
|
+
console.log(` Slug: ${template.slug}`);
|
|
611
|
+
console.log(` Category: ${template.category}`);
|
|
612
|
+
console.log(` Model: ${template.model}`);
|
|
613
|
+
console.log(` Est. Cost: $${template.estimatedCost.toFixed(2)}/day`);
|
|
614
|
+
console.log(` Description: ${template.description}`);
|
|
615
|
+
if (template.features?.length) {
|
|
616
|
+
console.log(` Features:`);
|
|
617
|
+
template.features.forEach((f) => console.log(` - ${f}`));
|
|
618
|
+
}
|
|
619
|
+
console.log();
|
|
620
|
+
}
|
|
621
|
+
async function cmdTemplatesDeploy(args) {
|
|
622
|
+
const client = getClient();
|
|
623
|
+
let slug = "";
|
|
624
|
+
let name = "";
|
|
625
|
+
let vpsIp = "";
|
|
626
|
+
let wallet = "";
|
|
627
|
+
for (let i = 0; i < args.length; i++) {
|
|
628
|
+
if (args[i] === "--template" && args[i + 1]) slug = args[++i];
|
|
629
|
+
else if (args[i] === "--name" && args[i + 1]) name = args[++i];
|
|
630
|
+
else if (args[i] === "--vps" && args[i + 1]) vpsIp = args[++i];
|
|
631
|
+
else if (args[i] === "--wallet" && args[i + 1]) wallet = args[++i];
|
|
632
|
+
}
|
|
633
|
+
if (!slug) slug = await prompt(" Template slug (e.g. trading-bot): ");
|
|
634
|
+
if (!name) name = await prompt(" Agent name: ");
|
|
635
|
+
if (!slug || !name) {
|
|
636
|
+
console.error(" Error: --template and --name are required.");
|
|
637
|
+
process.exit(1);
|
|
638
|
+
}
|
|
639
|
+
try {
|
|
640
|
+
const result = await client.deployTemplate({
|
|
641
|
+
templateSlug: slug,
|
|
642
|
+
name,
|
|
643
|
+
vpsIp: vpsIp || void 0,
|
|
644
|
+
walletAddress: wallet || void 0
|
|
645
|
+
});
|
|
646
|
+
if (result.success) {
|
|
647
|
+
console.log(`
|
|
648
|
+
Agent Deployed:`);
|
|
649
|
+
console.log(` ID: ${result.agent.id}`);
|
|
650
|
+
console.log(` Name: ${result.agent.name}`);
|
|
651
|
+
console.log(` Template: ${result.template.name} (${result.template.category})`);
|
|
652
|
+
console.log(` Model: ${result.agent.model}`);
|
|
653
|
+
console.log(` Tier: ${result.agent.survivalTier}
|
|
654
|
+
`);
|
|
655
|
+
} else {
|
|
656
|
+
console.error(" Deploy failed.");
|
|
657
|
+
}
|
|
658
|
+
} catch (err) {
|
|
659
|
+
console.error(` Error: ${err.message}`);
|
|
660
|
+
process.exit(1);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
474
663
|
async function cmdX402() {
|
|
475
664
|
const client = getClient();
|
|
476
665
|
const config = await client.getX402Config();
|
|
@@ -602,6 +791,254 @@ async function cmdLlmHealth() {
|
|
|
602
791
|
}
|
|
603
792
|
console.log();
|
|
604
793
|
}
|
|
794
|
+
async function cmdBv7xPromote(agentId) {
|
|
795
|
+
if (!agentId) {
|
|
796
|
+
console.error(" Usage: otonix bv7x:promote <agentId>");
|
|
797
|
+
process.exit(1);
|
|
798
|
+
}
|
|
799
|
+
const client = getClient();
|
|
800
|
+
const result = await client.promoteMothership(agentId);
|
|
801
|
+
console.log(`
|
|
802
|
+
Agent promoted to mothership:`);
|
|
803
|
+
console.log(` ID: ${result.agent.id}`);
|
|
804
|
+
console.log(` Name: ${result.agent.name}`);
|
|
805
|
+
console.log(` Role: ${result.agent.role}
|
|
806
|
+
`);
|
|
807
|
+
}
|
|
808
|
+
async function cmdBv7xSpawn(args) {
|
|
809
|
+
const client = getClient();
|
|
810
|
+
let mothershipId = "";
|
|
811
|
+
let templateSlug = "";
|
|
812
|
+
let name = "";
|
|
813
|
+
let vpsIp = "";
|
|
814
|
+
let wallet = "";
|
|
815
|
+
for (let i = 0; i < args.length; i++) {
|
|
816
|
+
if (args[i] === "--mothership" && args[i + 1]) mothershipId = args[++i];
|
|
817
|
+
else if (args[i] === "--template" && args[i + 1]) templateSlug = args[++i];
|
|
818
|
+
else if (args[i] === "--name" && args[i + 1]) name = args[++i];
|
|
819
|
+
else if (args[i] === "--vps" && args[i + 1]) vpsIp = args[++i];
|
|
820
|
+
else if (args[i] === "--wallet" && args[i + 1]) wallet = args[++i];
|
|
821
|
+
}
|
|
822
|
+
if (!mothershipId) mothershipId = await prompt(" Mothership Agent ID: ");
|
|
823
|
+
if (!templateSlug) templateSlug = await prompt(" Template slug (e.g. bv7x-alpha-trader): ");
|
|
824
|
+
if (!name) name = await prompt(" Satellite name: ");
|
|
825
|
+
if (!mothershipId || !templateSlug || !name) {
|
|
826
|
+
console.error(" Error: --mothership, --template, and --name are required.");
|
|
827
|
+
process.exit(1);
|
|
828
|
+
}
|
|
829
|
+
const result = await client.spawnSatellite({
|
|
830
|
+
mothershipId,
|
|
831
|
+
templateSlug,
|
|
832
|
+
name,
|
|
833
|
+
vpsIp: vpsIp || void 0,
|
|
834
|
+
walletAddress: wallet || void 0
|
|
835
|
+
});
|
|
836
|
+
console.log(`
|
|
837
|
+
Satellite Spawned:`);
|
|
838
|
+
console.log(` ID: ${result.satellite.id}`);
|
|
839
|
+
console.log(` Name: ${result.satellite.name}`);
|
|
840
|
+
console.log(` Model: ${result.satellite.model}`);
|
|
841
|
+
console.log(` Role: ${result.satellite.role}`);
|
|
842
|
+
console.log(` Template: ${result.template.name}`);
|
|
843
|
+
console.log(` Mothership: ${result.mothership.name} (${result.mothership.childrenCount} satellites)
|
|
844
|
+
`);
|
|
845
|
+
}
|
|
846
|
+
async function cmdBv7xSatellites(mothershipId) {
|
|
847
|
+
if (!mothershipId) {
|
|
848
|
+
console.error(" Usage: otonix bv7x:satellites <mothershipId>");
|
|
849
|
+
process.exit(1);
|
|
850
|
+
}
|
|
851
|
+
const client = getClient();
|
|
852
|
+
const result = await client.getMothershipSatellites(mothershipId);
|
|
853
|
+
console.log(`
|
|
854
|
+
Mothership: ${result.mothership.name} (${result.count} satellites)
|
|
855
|
+
`);
|
|
856
|
+
if (!result.satellites.length) {
|
|
857
|
+
console.log(" No satellites spawned yet.\n");
|
|
858
|
+
return;
|
|
859
|
+
}
|
|
860
|
+
printTable(result.satellites.map((s) => ({
|
|
861
|
+
ID: s.id.slice(0, 8),
|
|
862
|
+
Name: s.name,
|
|
863
|
+
Status: s.status,
|
|
864
|
+
Tier: s.survivalTier,
|
|
865
|
+
Model: s.model,
|
|
866
|
+
Heartbeat: formatTime(s.lastHeartbeat),
|
|
867
|
+
Actions: s.totalActions
|
|
868
|
+
})));
|
|
869
|
+
console.log();
|
|
870
|
+
}
|
|
871
|
+
async function cmdBv7xDestroy(satelliteId) {
|
|
872
|
+
if (!satelliteId) {
|
|
873
|
+
console.error(" Usage: otonix bv7x:destroy <satelliteId>");
|
|
874
|
+
process.exit(1);
|
|
875
|
+
}
|
|
876
|
+
const client = getClient();
|
|
877
|
+
const result = await client.destroySatellite(satelliteId);
|
|
878
|
+
console.log(` ${result.message}`);
|
|
879
|
+
}
|
|
880
|
+
async function cmdBv7xReport(args) {
|
|
881
|
+
let satelliteId = "";
|
|
882
|
+
let reportType = "general";
|
|
883
|
+
let dataStr = "";
|
|
884
|
+
for (let i = 0; i < args.length; i++) {
|
|
885
|
+
if (args[i] === "--type" && args[i + 1]) reportType = args[++i];
|
|
886
|
+
else if (args[i] === "--data" && args[i + 1]) dataStr = args[++i];
|
|
887
|
+
else if (!satelliteId) satelliteId = args[i];
|
|
888
|
+
}
|
|
889
|
+
if (!satelliteId) {
|
|
890
|
+
console.error(" Usage: otonix bv7x:report <satelliteId> --type <type> --data '<json>'");
|
|
891
|
+
process.exit(1);
|
|
892
|
+
}
|
|
893
|
+
let data = {};
|
|
894
|
+
if (dataStr) {
|
|
895
|
+
try {
|
|
896
|
+
data = JSON.parse(dataStr);
|
|
897
|
+
} catch {
|
|
898
|
+
console.error(" Error: --data must be valid JSON");
|
|
899
|
+
process.exit(1);
|
|
900
|
+
}
|
|
901
|
+
} else {
|
|
902
|
+
const raw = await prompt(" Report data (JSON): ");
|
|
903
|
+
try {
|
|
904
|
+
data = JSON.parse(raw);
|
|
905
|
+
} catch {
|
|
906
|
+
console.error(" Error: Invalid JSON");
|
|
907
|
+
process.exit(1);
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
const client = getClient();
|
|
911
|
+
await client.satelliteReport(satelliteId, { data, reportType });
|
|
912
|
+
console.log(` Report sent (type: ${reportType})`);
|
|
913
|
+
}
|
|
914
|
+
async function cmdBv7xFleet() {
|
|
915
|
+
const client = getClient();
|
|
916
|
+
const fleet = await client.getFleet();
|
|
917
|
+
console.log(`
|
|
918
|
+
BV-7X Fleet Overview`);
|
|
919
|
+
console.log(` Motherships: ${fleet.totalMotherships}`);
|
|
920
|
+
console.log(` Satellites: ${fleet.totalSatellites}`);
|
|
921
|
+
if (fleet.fleet.length) {
|
|
922
|
+
for (const f of fleet.fleet) {
|
|
923
|
+
console.log(`
|
|
924
|
+
\u250C Mothership: ${f.mothership.name} [${f.mothership.status}] \u2014 ${f.satelliteCount} satellite(s)`);
|
|
925
|
+
for (const s of f.satellites) {
|
|
926
|
+
console.log(` \u2502 \u2514 ${s.name} [${s.status}] tier:${s.survivalTier} heartbeat:${formatTime(s.lastHeartbeat)}`);
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
if (fleet.orphanedSatellites.length) {
|
|
931
|
+
console.log(`
|
|
932
|
+
Orphaned Satellites: ${fleet.orphanedSatellites.length}`);
|
|
933
|
+
for (const s of fleet.orphanedSatellites) {
|
|
934
|
+
console.log(` \u2022 ${s.name} [${s.status}]`);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
console.log();
|
|
938
|
+
}
|
|
939
|
+
async function cmdWebhookCreate(args) {
|
|
940
|
+
const client = getClient();
|
|
941
|
+
let url = "";
|
|
942
|
+
let agentId = "";
|
|
943
|
+
const events = [];
|
|
944
|
+
for (let i = 0; i < args.length; i++) {
|
|
945
|
+
if (args[i] === "--url" && args[i + 1]) url = args[++i];
|
|
946
|
+
else if (args[i] === "--agent" && args[i + 1]) agentId = args[++i];
|
|
947
|
+
else if (args[i] === "--event" && args[i + 1]) events.push(args[++i]);
|
|
948
|
+
}
|
|
949
|
+
if (!url) url = await prompt(" Webhook URL: ");
|
|
950
|
+
if (!url) {
|
|
951
|
+
console.error(" Error: URL is required.");
|
|
952
|
+
process.exit(1);
|
|
953
|
+
}
|
|
954
|
+
const result = await client.createWebhook({
|
|
955
|
+
url,
|
|
956
|
+
events: events.length ? events : void 0,
|
|
957
|
+
agentId: agentId || void 0
|
|
958
|
+
});
|
|
959
|
+
console.log(`
|
|
960
|
+
Webhook Created:`);
|
|
961
|
+
console.log(` ID: ${result.id}`);
|
|
962
|
+
console.log(` URL: ${result.url}`);
|
|
963
|
+
console.log(` Events: ${result.events.length ? result.events.join(", ") : "all"}`);
|
|
964
|
+
console.log(` Secret: ${result.secret}`);
|
|
965
|
+
console.log(`
|
|
966
|
+
Save this secret \u2014 it won't be shown again.
|
|
967
|
+
`);
|
|
968
|
+
}
|
|
969
|
+
async function cmdWebhookList() {
|
|
970
|
+
const client = getClient();
|
|
971
|
+
const hooks = await client.listWebhooks();
|
|
972
|
+
if (!hooks.length) {
|
|
973
|
+
console.log("\n No webhooks registered.\n");
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
console.log(`
|
|
977
|
+
Webhooks (${hooks.length}):
|
|
978
|
+
`);
|
|
979
|
+
printTable(hooks.map((h) => ({
|
|
980
|
+
ID: h.id.slice(0, 8),
|
|
981
|
+
URL: h.url.length > 40 ? h.url.slice(0, 37) + "..." : h.url,
|
|
982
|
+
Events: h.events.length ? h.events.length + " types" : "all",
|
|
983
|
+
Status: h.status,
|
|
984
|
+
Fails: h.failCount,
|
|
985
|
+
Agent: h.agentId?.slice(0, 8) || "global"
|
|
986
|
+
})));
|
|
987
|
+
console.log();
|
|
988
|
+
}
|
|
989
|
+
async function cmdWebhookDelete(webhookId) {
|
|
990
|
+
if (!webhookId) {
|
|
991
|
+
console.error(" Usage: otonix webhook:delete <webhookId>");
|
|
992
|
+
process.exit(1);
|
|
993
|
+
}
|
|
994
|
+
const client = getClient();
|
|
995
|
+
const result = await client.deleteWebhook(webhookId);
|
|
996
|
+
console.log(` ${result.message}`);
|
|
997
|
+
}
|
|
998
|
+
async function cmdWebhookTest(webhookId) {
|
|
999
|
+
if (!webhookId) {
|
|
1000
|
+
console.error(" Usage: otonix webhook:test <webhookId>");
|
|
1001
|
+
process.exit(1);
|
|
1002
|
+
}
|
|
1003
|
+
const client = getClient();
|
|
1004
|
+
const result = await client.testWebhook(webhookId);
|
|
1005
|
+
console.log(` ${result.message}`);
|
|
1006
|
+
}
|
|
1007
|
+
async function cmdWebhookDeliveries(args) {
|
|
1008
|
+
let webhookId = args[0] || "";
|
|
1009
|
+
if (!webhookId) {
|
|
1010
|
+
console.error(" Usage: otonix webhook:deliveries <webhookId>");
|
|
1011
|
+
process.exit(1);
|
|
1012
|
+
}
|
|
1013
|
+
const client = getClient();
|
|
1014
|
+
const deliveries = await client.getWebhookDeliveries(webhookId);
|
|
1015
|
+
if (!deliveries.length) {
|
|
1016
|
+
console.log("\n No deliveries found.\n");
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
console.log(`
|
|
1020
|
+
Webhook Deliveries (${deliveries.length}):
|
|
1021
|
+
`);
|
|
1022
|
+
printTable(deliveries.slice(0, 20).map((d) => ({
|
|
1023
|
+
Event: d.event,
|
|
1024
|
+
Status: d.statusCode || "\u2014",
|
|
1025
|
+
Success: d.success ? "yes" : "no",
|
|
1026
|
+
Time: formatTime(d.createdAt),
|
|
1027
|
+
Response: (d.response || "\u2014").slice(0, 30)
|
|
1028
|
+
})));
|
|
1029
|
+
console.log();
|
|
1030
|
+
}
|
|
1031
|
+
async function cmdWebhookEvents() {
|
|
1032
|
+
const client = getClient();
|
|
1033
|
+
const result = await client.listWebhookEvents();
|
|
1034
|
+
console.log(`
|
|
1035
|
+
Available Webhook Events (${result.events.length}):
|
|
1036
|
+
`);
|
|
1037
|
+
for (const event of result.events) {
|
|
1038
|
+
console.log(` \u2022 ${event}`);
|
|
1039
|
+
}
|
|
1040
|
+
console.log();
|
|
1041
|
+
}
|
|
605
1042
|
function cmdWhoami() {
|
|
606
1043
|
const config = loadConfig();
|
|
607
1044
|
if (!config) {
|
|
@@ -660,12 +1097,66 @@ async function main() {
|
|
|
660
1097
|
case "engine":
|
|
661
1098
|
await cmdEngine();
|
|
662
1099
|
break;
|
|
1100
|
+
case "credits":
|
|
1101
|
+
await cmdCredits(rest[0]);
|
|
1102
|
+
break;
|
|
1103
|
+
case "credits:transfer":
|
|
1104
|
+
await cmdCreditsTransfer(rest);
|
|
1105
|
+
break;
|
|
1106
|
+
case "credits:history":
|
|
1107
|
+
await cmdCreditsHistory(rest[0]);
|
|
1108
|
+
break;
|
|
1109
|
+
case "templates":
|
|
1110
|
+
await cmdTemplates();
|
|
1111
|
+
break;
|
|
1112
|
+
case "templates:info":
|
|
1113
|
+
await cmdTemplatesInfo(rest[0]);
|
|
1114
|
+
break;
|
|
1115
|
+
case "templates:deploy":
|
|
1116
|
+
await cmdTemplatesDeploy(rest);
|
|
1117
|
+
break;
|
|
663
1118
|
case "marketplace":
|
|
664
1119
|
await cmdMarketplace();
|
|
665
1120
|
break;
|
|
666
1121
|
case "x402":
|
|
667
1122
|
await cmdX402();
|
|
668
1123
|
break;
|
|
1124
|
+
case "bv7x:promote":
|
|
1125
|
+
await cmdBv7xPromote(rest[0]);
|
|
1126
|
+
break;
|
|
1127
|
+
case "bv7x:spawn":
|
|
1128
|
+
await cmdBv7xSpawn(rest);
|
|
1129
|
+
break;
|
|
1130
|
+
case "bv7x:satellites":
|
|
1131
|
+
await cmdBv7xSatellites(rest[0]);
|
|
1132
|
+
break;
|
|
1133
|
+
case "bv7x:destroy":
|
|
1134
|
+
await cmdBv7xDestroy(rest[0]);
|
|
1135
|
+
break;
|
|
1136
|
+
case "bv7x:report":
|
|
1137
|
+
await cmdBv7xReport(rest);
|
|
1138
|
+
break;
|
|
1139
|
+
case "bv7x:fleet":
|
|
1140
|
+
await cmdBv7xFleet();
|
|
1141
|
+
break;
|
|
1142
|
+
case "webhook:create":
|
|
1143
|
+
await cmdWebhookCreate(rest);
|
|
1144
|
+
break;
|
|
1145
|
+
case "webhook:list":
|
|
1146
|
+
await cmdWebhookList();
|
|
1147
|
+
break;
|
|
1148
|
+
case "webhook:delete":
|
|
1149
|
+
await cmdWebhookDelete(rest[0]);
|
|
1150
|
+
break;
|
|
1151
|
+
case "webhook:test":
|
|
1152
|
+
await cmdWebhookTest(rest[0]);
|
|
1153
|
+
break;
|
|
1154
|
+
case "webhook:deliveries":
|
|
1155
|
+
await cmdWebhookDeliveries(rest);
|
|
1156
|
+
break;
|
|
1157
|
+
case "webhook:events":
|
|
1158
|
+
await cmdWebhookEvents();
|
|
1159
|
+
break;
|
|
669
1160
|
case "llm:init":
|
|
670
1161
|
cmdLlmInit(rest[0]);
|
|
671
1162
|
break;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@otonix/cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "CLI tool for the Otonix sovereign compute platform — initialize agents, generate API keys, register, monitor status, and manage infrastructure from the terminal.",
|
|
3
|
+
"version": "1.4.0",
|
|
4
|
+
"description": "CLI tool for the Otonix sovereign compute platform — initialize agents, generate API keys, register, monitor status, BV-7X fleet orchestration, webhook management, and manage infrastructure from the terminal.",
|
|
5
5
|
"main": "dist/cli.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"otonix": "dist/cli.js"
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"node": ">=18"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@otonix/sdk": "^1.
|
|
41
|
+
"@otonix/sdk": "^1.4.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"tsup": "^8.0.0",
|