arc402-cli 0.7.5 → 0.8.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/MIGRATION-SPEC.md +108 -0
- package/dist/abis.js +14 -17
- package/dist/abis.js.map +1 -1
- package/dist/bundler.d.ts +1 -1
- package/dist/bundler.d.ts.map +1 -1
- package/dist/bundler.js +27 -61
- package/dist/bundler.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -9
- package/dist/client.js.map +1 -1
- package/dist/coinbase-smart-wallet.js +1 -4
- package/dist/coinbase-smart-wallet.js.map +1 -1
- package/dist/commands/accept.js +25 -28
- package/dist/commands/accept.js.map +1 -1
- package/dist/commands/agent-handshake.js +15 -18
- package/dist/commands/agent-handshake.js.map +1 -1
- package/dist/commands/agent.js +98 -104
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/agreements.js +62 -98
- package/dist/commands/agreements.js.map +1 -1
- package/dist/commands/arbitrator.js +45 -81
- package/dist/commands/arbitrator.js.map +1 -1
- package/dist/commands/arena-handshake.js +27 -30
- package/dist/commands/arena-handshake.js.map +1 -1
- package/dist/commands/arena.js +12 -18
- package/dist/commands/arena.js.map +1 -1
- package/dist/commands/backup.js +30 -36
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/cancel.js +15 -18
- package/dist/commands/cancel.js.map +1 -1
- package/dist/commands/channel.js +45 -81
- package/dist/commands/channel.js.map +1 -1
- package/dist/commands/coldstart.js +31 -34
- package/dist/commands/coldstart.js.map +1 -1
- package/dist/commands/config.js +23 -29
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contract-interaction.js +12 -15
- package/dist/commands/contract-interaction.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +98 -135
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/deliver.js +37 -76
- package/dist/commands/deliver.js.map +1 -1
- package/dist/commands/discover.js +24 -27
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/dispute.js +104 -110
- package/dist/commands/dispute.js.map +1 -1
- package/dist/commands/doctor.js +16 -55
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/endpoint.js +56 -95
- package/dist/commands/endpoint.js.map +1 -1
- package/dist/commands/feed.js +11 -18
- package/dist/commands/feed.js.map +1 -1
- package/dist/commands/hire.js +37 -40
- package/dist/commands/hire.js.map +1 -1
- package/dist/commands/migrate.js +30 -33
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/negotiate.d.ts.map +1 -1
- package/dist/commands/negotiate.js +34 -36
- package/dist/commands/negotiate.js.map +1 -1
- package/dist/commands/openshell.js +68 -104
- package/dist/commands/openshell.js.map +1 -1
- package/dist/commands/owner.js +17 -20
- package/dist/commands/owner.js.map +1 -1
- package/dist/commands/policy.js +41 -43
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/relay.d.ts.map +1 -1
- package/dist/commands/relay.js +18 -51
- package/dist/commands/relay.js.map +1 -1
- package/dist/commands/remediate.js +20 -23
- package/dist/commands/remediate.js.map +1 -1
- package/dist/commands/reputation.js +25 -27
- package/dist/commands/reputation.js.map +1 -1
- package/dist/commands/setup.js +65 -104
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/trust.js +17 -20
- package/dist/commands/trust.js.map +1 -1
- package/dist/commands/verify.js +18 -21
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/wallet.js +619 -625
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/watch.js +33 -36
- package/dist/commands/watch.js.map +1 -1
- package/dist/commands/watchtower.js +37 -73
- package/dist/commands/watchtower.js.map +1 -1
- package/dist/commands/workroom.d.ts.map +1 -1
- package/dist/commands/workroom.js +138 -171
- package/dist/commands/workroom.js.map +1 -1
- package/dist/config.js +21 -65
- package/dist/config.js.map +1 -1
- package/dist/daemon/config.d.ts.map +1 -1
- package/dist/daemon/config.js +16 -53
- package/dist/daemon/config.js.map +1 -1
- package/dist/daemon/hire-listener.d.ts +3 -3
- package/dist/daemon/hire-listener.d.ts.map +1 -1
- package/dist/daemon/hire-listener.js +13 -47
- package/dist/daemon/hire-listener.js.map +1 -1
- package/dist/daemon/index.d.ts +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +50 -88
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/job-lifecycle.d.ts +1 -1
- package/dist/daemon/job-lifecycle.d.ts.map +1 -1
- package/dist/daemon/job-lifecycle.js +11 -51
- package/dist/daemon/job-lifecycle.js.map +1 -1
- package/dist/daemon/notify.d.ts +1 -1
- package/dist/daemon/notify.d.ts.map +1 -1
- package/dist/daemon/notify.js +19 -53
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/token-metering.js +8 -47
- package/dist/daemon/token-metering.js.map +1 -1
- package/dist/daemon/userops.d.ts +2 -2
- package/dist/daemon/userops.d.ts.map +1 -1
- package/dist/daemon/userops.js +23 -27
- package/dist/daemon/userops.js.map +1 -1
- package/dist/daemon/wallet-monitor.d.ts +1 -1
- package/dist/daemon/wallet-monitor.d.ts.map +1 -1
- package/dist/daemon/wallet-monitor.js +8 -12
- package/dist/daemon/wallet-monitor.js.map +1 -1
- package/dist/drain-v4.js +26 -64
- package/dist/drain-v4.js.map +1 -1
- package/dist/endpoint-config.js +20 -63
- package/dist/endpoint-config.js.map +1 -1
- package/dist/endpoint-notify.js +9 -48
- package/dist/endpoint-notify.js.map +1 -1
- package/dist/index.js +16 -50
- package/dist/index.js.map +1 -1
- package/dist/openshell-runtime.d.ts.map +1 -1
- package/dist/openshell-runtime.js +38 -82
- package/dist/openshell-runtime.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +77 -83
- package/dist/program.js.map +1 -1
- package/dist/repl.js +25 -31
- package/dist/repl.js.map +1 -1
- package/dist/signing.js +3 -6
- package/dist/signing.js.map +1 -1
- package/dist/telegram-notify.js +3 -40
- package/dist/telegram-notify.js.map +1 -1
- package/dist/tui/App.d.ts +1 -9
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +47 -65
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Footer.js +4 -7
- package/dist/tui/Footer.js.map +1 -1
- package/dist/tui/Header.d.ts +1 -2
- package/dist/tui/Header.d.ts.map +1 -1
- package/dist/tui/Header.js +8 -14
- package/dist/tui/Header.js.map +1 -1
- package/dist/tui/InputLine.js +17 -23
- package/dist/tui/InputLine.js.map +1 -1
- package/dist/tui/Viewport.d.ts +5 -4
- package/dist/tui/Viewport.d.ts.map +1 -1
- package/dist/tui/Viewport.js +20 -13
- package/dist/tui/Viewport.js.map +1 -1
- package/dist/tui/WalletConnectPairing.d.ts +23 -0
- package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
- package/dist/tui/WalletConnectPairing.js +75 -0
- package/dist/tui/WalletConnectPairing.js.map +1 -0
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +14 -21
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/useChat.js +13 -19
- package/dist/tui/useChat.js.map +1 -1
- package/dist/tui/useCommand.d.ts +2 -7
- package/dist/tui/useCommand.d.ts.map +1 -1
- package/dist/tui/useCommand.js +77 -165
- package/dist/tui/useCommand.js.map +1 -1
- package/dist/tui/useScroll.js +9 -12
- package/dist/tui/useScroll.js.map +1 -1
- package/dist/ui/banner.js +12 -19
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/colors.js +13 -19
- package/dist/ui/colors.js.map +1 -1
- package/dist/ui/format.js +6 -14
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/spinner.js +6 -12
- package/dist/ui/spinner.js.map +1 -1
- package/dist/ui/tree.js +3 -6
- package/dist/ui/tree.js.map +1 -1
- package/dist/utils/format.js +27 -41
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/hash.js +4 -42
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/time.js +2 -6
- package/dist/utils/time.js.map +1 -1
- package/dist/wallet-router.d.ts +1 -1
- package/dist/wallet-router.d.ts.map +1 -1
- package/dist/wallet-router.js +12 -19
- package/dist/wallet-router.js.map +1 -1
- package/dist/walletconnect-session.d.ts +1 -1
- package/dist/walletconnect-session.d.ts.map +1 -1
- package/dist/walletconnect-session.js +6 -11
- package/dist/walletconnect-session.js.map +1 -1
- package/dist/walletconnect.d.ts +6 -1
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js +32 -35
- package/dist/walletconnect.js.map +1 -1
- package/package.json +7 -6
- package/src/bundler.ts +1 -1
- package/src/client.ts +1 -1
- package/src/commands/accept.ts +7 -7
- package/src/commands/agent-handshake.ts +4 -4
- package/src/commands/agent.ts +9 -9
- package/src/commands/agreements.ts +8 -8
- package/src/commands/arbitrator.ts +5 -5
- package/src/commands/arena-handshake.ts +6 -6
- package/src/commands/arena.ts +2 -2
- package/src/commands/backup.ts +1 -1
- package/src/commands/cancel.ts +6 -6
- package/src/commands/channel.ts +6 -6
- package/src/commands/coldstart.ts +5 -5
- package/src/commands/config.ts +2 -2
- package/src/commands/contract-interaction.ts +2 -2
- package/src/commands/daemon.ts +14 -11
- package/src/commands/deliver.ts +9 -9
- package/src/commands/discover.ts +5 -5
- package/src/commands/dispute.ts +7 -7
- package/src/commands/doctor.ts +2 -2
- package/src/commands/endpoint.ts +6 -6
- package/src/commands/feed.ts +1 -1
- package/src/commands/hire.ts +10 -10
- package/src/commands/migrate.ts +7 -7
- package/src/commands/negotiate.ts +6 -5
- package/src/commands/openshell.ts +4 -4
- package/src/commands/owner.ts +5 -5
- package/src/commands/policy.ts +5 -5
- package/src/commands/relay.ts +5 -1
- package/src/commands/remediate.ts +5 -5
- package/src/commands/reputation.ts +6 -6
- package/src/commands/setup.ts +1 -1
- package/src/commands/trust.ts +6 -6
- package/src/commands/verify.ts +6 -6
- package/src/commands/wallet.ts +15 -15
- package/src/commands/watch.ts +3 -3
- package/src/commands/watchtower.ts +6 -6
- package/src/commands/workroom.ts +14 -10
- package/src/daemon/config.ts +2 -1
- package/src/daemon/hire-listener.ts +3 -3
- package/src/daemon/index.ts +10 -9
- package/src/daemon/job-lifecycle.ts +1 -1
- package/src/daemon/notify.ts +4 -4
- package/src/daemon/userops.ts +4 -4
- package/src/daemon/wallet-monitor.ts +2 -2
- package/src/endpoint-notify.ts +1 -1
- package/src/index.ts +8 -7
- package/src/openshell-runtime.ts +5 -1
- package/src/program.ts +36 -36
- package/src/repl.ts +3 -3
- package/src/tui/App.tsx +26 -47
- package/src/tui/Header.tsx +3 -10
- package/src/tui/InputLine.tsx +1 -1
- package/src/tui/Viewport.tsx +22 -18
- package/src/tui/WalletConnectPairing.tsx +131 -0
- package/src/tui/index.tsx +7 -8
- package/src/tui/useChat.ts +1 -1
- package/src/tui/useCommand.ts +86 -183
- package/src/ui/banner.ts +2 -2
- package/src/ui/tree.ts +1 -1
- package/src/wallet-router.ts +2 -2
- package/src/walletconnect-session.ts +1 -1
- package/src/walletconnect.ts +20 -5
- package/tsconfig.json +16 -7
|
@@ -1,36 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const client_1 = require("../client");
|
|
7
|
-
const colors_1 = require("../ui/colors");
|
|
8
|
-
const tree_1 = require("../ui/tree");
|
|
1
|
+
import { ethers } from "ethers";
|
|
2
|
+
import { loadConfig } from "../config.js";
|
|
3
|
+
import { requireSigner } from "../client.js";
|
|
4
|
+
import { c } from "../ui/colors.js";
|
|
5
|
+
import { renderTree } from "../ui/tree.js";
|
|
9
6
|
// Challenge-response: both agents sign a shared nonce with their agent key
|
|
10
7
|
// and verify each other against AgentRegistry
|
|
11
8
|
const AGENT_REGISTRY_ABI = [
|
|
12
9
|
"function isRegistered(address wallet) view returns (bool)",
|
|
13
10
|
"function getAgent(address wallet) view returns (tuple(address wallet, string endpoint, string serviceType, bool active, uint256 registeredAt))",
|
|
14
11
|
];
|
|
15
|
-
function registerHandshakeCommand(program) {
|
|
12
|
+
export function registerHandshakeCommand(program) {
|
|
16
13
|
program
|
|
17
14
|
.command("handshake <agentAddress>")
|
|
18
15
|
.description("Mutual challenge-response authentication with another ARC-402 agent. Verifies both parties are registered before any negotiation begins.")
|
|
19
16
|
.option("--json", "Output as machine-parseable JSON")
|
|
20
17
|
.action(async (agentAddress, opts) => {
|
|
21
|
-
const config =
|
|
22
|
-
const { signer, provider } = await
|
|
18
|
+
const config = loadConfig();
|
|
19
|
+
const { signer, provider } = await requireSigner(config);
|
|
23
20
|
const myAddress = await signer.getAddress();
|
|
24
21
|
// Generate shared challenge nonce
|
|
25
|
-
const challengeNonce =
|
|
22
|
+
const challengeNonce = ethers.hexlify(ethers.randomBytes(32));
|
|
26
23
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
27
24
|
// Sign: keccak256(HANDSHAKE + myAddress + theirAddress + challengeNonce + timestamp)
|
|
28
|
-
const digest =
|
|
29
|
-
const mySig = await signer.signMessage(
|
|
25
|
+
const digest = ethers.solidityPackedKeccak256(["string", "address", "address", "bytes32", "uint256"], ["HANDSHAKE", myAddress, agentAddress, challengeNonce, timestamp]);
|
|
26
|
+
const mySig = await signer.signMessage(ethers.getBytes(digest));
|
|
30
27
|
// Fetch their endpoint from AgentRegistry to send challenge
|
|
31
28
|
if (!config.agentRegistryAddress)
|
|
32
29
|
throw new Error("agentRegistryAddress not configured");
|
|
33
|
-
const registry = new
|
|
30
|
+
const registry = new ethers.Contract(config.agentRegistryAddress, AGENT_REGISTRY_ABI, provider);
|
|
34
31
|
const myRegistered = await registry.isRegistered(myAddress);
|
|
35
32
|
if (!myRegistered)
|
|
36
33
|
throw new Error(`Your wallet ${myAddress} is not registered in AgentRegistry`);
|
|
@@ -52,13 +49,13 @@ function registerHandshakeCommand(program) {
|
|
|
52
49
|
console.log(JSON.stringify(challenge));
|
|
53
50
|
}
|
|
54
51
|
else {
|
|
55
|
-
console.log('\n ' +
|
|
56
|
-
|
|
52
|
+
console.log('\n ' + c.mark + c.white(' Handshake'));
|
|
53
|
+
renderTree([
|
|
57
54
|
{ label: 'Your identity', value: `${myAddress} (registered)` },
|
|
58
55
|
{ label: 'Their identity', value: `${agentAddress} (registered, active)` },
|
|
59
56
|
{ label: 'Their endpoint', value: theirAgent.endpoint, last: true },
|
|
60
57
|
]);
|
|
61
|
-
console.log('\n ' +
|
|
58
|
+
console.log('\n ' + c.dim('Signed challenge (send to their endpoint to complete handshake):'));
|
|
62
59
|
console.log(JSON.stringify(challenge, null, 2));
|
|
63
60
|
}
|
|
64
61
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-handshake.js","sourceRoot":"","sources":["../../src/commands/agent-handshake.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-handshake.js","sourceRoot":"","sources":["../../src/commands/agent-handshake.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,2EAA2E;AAC3E,8CAA8C;AAE9C,MAAM,kBAAkB,GAAG;IACzB,2DAA2D;IAC3D,gJAAgJ;CACjJ,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,0IAA0I,CAAC;SACvJ,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,IAAI,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAE5C,kCAAkC;QAClC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEhD,qFAAqF;QACrF,MAAM,MAAM,GAAG,MAAM,CAAC,uBAAuB,CAC3C,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EACtD,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAClE,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAEhE,4DAA4D;QAC5D,IAAI,CAAC,MAAM,CAAC,oBAAoB;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAEhG,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,SAAS,qCAAqC,CAAC,CAAC;QAElG,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,YAAY,iCAAiC,CAAC,CAAC;QAEhG,yEAAyE;QACzE,kFAAkF;QAClF,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,cAAc;YACrB,SAAS;YACT,GAAG,EAAE,KAAK;YACV,aAAa,EAAE,UAAU,CAAC,QAAQ;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YACpD,UAAU,CAAC;gBACT,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,SAAS,eAAe,EAAE;gBAC9D,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,YAAY,uBAAuB,EAAE;gBAC1E,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;aACpE,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/commands/agent.js
CHANGED
|
@@ -1,33 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const wallet_router_1 = require("../wallet-router");
|
|
15
|
-
const client_2 = require("../client");
|
|
16
|
-
const prompts_1 = __importDefault(require("prompts"));
|
|
17
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
18
|
-
const spinner_1 = require("../ui/spinner");
|
|
19
|
-
const tree_1 = require("../ui/tree");
|
|
1
|
+
import { AgentRegistryClient } from "@arc402/sdk";
|
|
2
|
+
import { buildMetadata, uploadMetadata, decodeMetadata } from "@arc402/sdk";
|
|
3
|
+
import { ethers } from "ethers";
|
|
4
|
+
import { loadConfig, NETWORK_DEFAULTS } from "../config.js";
|
|
5
|
+
import { requireSigner } from "../client.js";
|
|
6
|
+
import { formatDate, getTrustTier } from "../utils/format.js";
|
|
7
|
+
import { AGENT_REGISTRY_ABI } from "../abis.js";
|
|
8
|
+
import { executeContractWriteViaWallet } from "../wallet-router.js";
|
|
9
|
+
import { getClient } from "../client.js";
|
|
10
|
+
import prompts from "prompts";
|
|
11
|
+
import chalk from "chalk";
|
|
12
|
+
import { startSpinner } from "../ui/spinner.js";
|
|
13
|
+
import { renderTree } from "../ui/tree.js";
|
|
20
14
|
// ─── helpers ──────────────────────────────────────────────────────────────────
|
|
21
15
|
/** Resolve the real AgentRegistry address (agentRegistryV2Address > NETWORK_DEFAULTS fallback). */
|
|
22
16
|
function getAgentRegistryAddress(config) {
|
|
23
17
|
const addr = config.agentRegistryV2Address ??
|
|
24
|
-
|
|
18
|
+
NETWORK_DEFAULTS[config.network]?.agentRegistryV2Address;
|
|
25
19
|
if (!addr)
|
|
26
20
|
throw new Error("agentRegistryV2Address missing in config — run `arc402 config set agentRegistryV2Address <address>`");
|
|
27
21
|
return addr;
|
|
28
22
|
}
|
|
29
23
|
// ─── commands ─────────────────────────────────────────────────────────────────
|
|
30
|
-
function registerAgentCommands(program) {
|
|
24
|
+
export function registerAgentCommands(program) {
|
|
31
25
|
const agent = program
|
|
32
26
|
.command("agent")
|
|
33
27
|
.description("Agent registry operations");
|
|
@@ -43,7 +37,7 @@ function registerAgentCommands(program) {
|
|
|
43
37
|
.option("--claim-subdomain <subdomain>", "Claim a <subdomain>.arc402.xyz after registration (launch default: host-managed public ingress outside the sandbox)")
|
|
44
38
|
.option("--tunnel-target <url>", "Host ingress target URL for the claimed subdomain (required with --claim-subdomain)")
|
|
45
39
|
.action(async (opts) => {
|
|
46
|
-
const config =
|
|
40
|
+
const config = loadConfig();
|
|
47
41
|
const registryAddress = getAgentRegistryAddress(config);
|
|
48
42
|
let metadataUri = opts.metadataUri ?? "";
|
|
49
43
|
if (opts.setMetadata) {
|
|
@@ -53,16 +47,16 @@ function registerAgentCommands(program) {
|
|
|
53
47
|
? opts.capability.split(",").map((v) => v.trim())
|
|
54
48
|
: [];
|
|
55
49
|
if (opts.endpoint) {
|
|
56
|
-
console.log(
|
|
57
|
-
console.log(
|
|
50
|
+
console.log(chalk.dim(`ℹ Registering public endpoint: ${opts.endpoint}`));
|
|
51
|
+
console.log(chalk.dim(" This publishes discovery / ingress metadata only. Sandbox outbound access remains controlled separately by OpenShell policy."));
|
|
58
52
|
}
|
|
59
53
|
if (config.walletContractAddress) {
|
|
60
54
|
// ── wallet contract path (machine key signs, wallet is msg.sender) ──
|
|
61
55
|
// Pre-flight: check machine key is authorized (J5-03)
|
|
62
56
|
if (config.privateKey) {
|
|
63
|
-
const machineKeyAddr = new
|
|
64
|
-
const { provider: agentProvider } = await
|
|
65
|
-
const mkCheck = new
|
|
57
|
+
const machineKeyAddr = new ethers.Wallet(config.privateKey).address;
|
|
58
|
+
const { provider: agentProvider } = await getClient(config);
|
|
59
|
+
const mkCheck = new ethers.Contract(config.walletContractAddress, ["function authorizedMachineKeys(address) external view returns (bool)"], agentProvider);
|
|
66
60
|
let isAuthorized = true;
|
|
67
61
|
try {
|
|
68
62
|
isAuthorized = await mkCheck.authorizedMachineKeys(machineKeyAddr);
|
|
@@ -75,18 +69,18 @@ function registerAgentCommands(program) {
|
|
|
75
69
|
}
|
|
76
70
|
}
|
|
77
71
|
console.log(`Registering via ARC402Wallet: ${config.walletContractAddress}`);
|
|
78
|
-
const { signer, provider: regProvider } = await
|
|
72
|
+
const { signer, provider: regProvider } = await requireSigner(config);
|
|
79
73
|
{
|
|
80
74
|
const walletBalance = await regProvider.getBalance(config.walletContractAddress);
|
|
81
|
-
if (walletBalance <
|
|
82
|
-
console.warn(
|
|
75
|
+
if (walletBalance < ethers.parseEther("0.0001")) {
|
|
76
|
+
console.warn(chalk.yellow(`⚠️ Low wallet balance: ${ethers.formatEther(walletBalance)} ETH. Registration may fail due to insufficient gas. Fund your wallet with at least 0.0001 ETH first.`));
|
|
83
77
|
}
|
|
84
78
|
}
|
|
85
|
-
const regSpinner =
|
|
86
|
-
const tx = await
|
|
79
|
+
const regSpinner = startSpinner("Registering agent...");
|
|
80
|
+
const tx = await executeContractWriteViaWallet(config.walletContractAddress, signer, registryAddress, AGENT_REGISTRY_ABI, "register", [opts.name, capabilities, opts.serviceType, opts.endpoint ?? "", metadataUri]);
|
|
87
81
|
const receipt = await tx.wait();
|
|
88
82
|
regSpinner.succeed("Registered in AgentRegistry");
|
|
89
|
-
|
|
83
|
+
renderTree([
|
|
90
84
|
{ label: "Wallet", value: config.walletContractAddress },
|
|
91
85
|
{ label: "Tx", value: receipt?.hash ?? "", last: !metadataUri },
|
|
92
86
|
...(metadataUri ? [{ label: "Metadata", value: metadataUri, last: true }] : []),
|
|
@@ -94,29 +88,29 @@ function registerAgentCommands(program) {
|
|
|
94
88
|
}
|
|
95
89
|
else {
|
|
96
90
|
// ── EOA fallback ──
|
|
97
|
-
console.warn(
|
|
98
|
-
const { signer, address: regAddress, provider: regProvider } = await
|
|
91
|
+
console.warn(chalk.yellow("⚠ No walletContractAddress in config — registering from EOA key (msg.sender = hot key)."));
|
|
92
|
+
const { signer, address: regAddress, provider: regProvider } = await requireSigner(config);
|
|
99
93
|
{
|
|
100
94
|
const walletBalance = await regProvider.getBalance(regAddress);
|
|
101
|
-
if (walletBalance <
|
|
102
|
-
console.warn(
|
|
95
|
+
if (walletBalance < ethers.parseEther("0.0001")) {
|
|
96
|
+
console.warn(chalk.yellow(`⚠️ Low wallet balance: ${ethers.formatEther(walletBalance)} ETH. Registration may fail due to insufficient gas. Fund your wallet with at least 0.0001 ETH first.`));
|
|
103
97
|
}
|
|
104
98
|
}
|
|
105
|
-
const client = new
|
|
106
|
-
const eoaSpinner =
|
|
99
|
+
const client = new AgentRegistryClient(registryAddress, signer);
|
|
100
|
+
const eoaSpinner = startSpinner("Registering agent...");
|
|
107
101
|
await client.register({ name: opts.name, serviceType: opts.serviceType, capabilities, endpoint: opts.endpoint ?? "", metadataURI: metadataUri });
|
|
108
102
|
eoaSpinner.succeed("Registered in AgentRegistry");
|
|
109
103
|
if (metadataUri) {
|
|
110
|
-
|
|
104
|
+
renderTree([{ label: "Metadata", value: metadataUri, last: true }]);
|
|
111
105
|
}
|
|
112
106
|
}
|
|
113
107
|
// ── optional subdomain claim ──────────────────────────────────────────
|
|
114
108
|
if (opts.claimSubdomain) {
|
|
115
109
|
if (!opts.tunnelTarget) {
|
|
116
|
-
console.error(
|
|
110
|
+
console.error(chalk.red("--tunnel-target <url> is required with --claim-subdomain"));
|
|
117
111
|
process.exit(1);
|
|
118
112
|
}
|
|
119
|
-
const walletAddress = config.walletContractAddress ?? new
|
|
113
|
+
const walletAddress = config.walletContractAddress ?? new ethers.Wallet(config.privateKey).address;
|
|
120
114
|
await claimSubdomain(opts.claimSubdomain, walletAddress, opts.tunnelTarget);
|
|
121
115
|
}
|
|
122
116
|
});
|
|
@@ -129,21 +123,21 @@ function registerAgentCommands(program) {
|
|
|
129
123
|
.option("--endpoint <url>", "Endpoint", "")
|
|
130
124
|
.option("--metadata-uri <uri>", "Metadata URI", "")
|
|
131
125
|
.action(async (opts) => {
|
|
132
|
-
const config =
|
|
126
|
+
const config = loadConfig();
|
|
133
127
|
const registryAddress = getAgentRegistryAddress(config);
|
|
134
128
|
const capabilities = opts.capability
|
|
135
129
|
? opts.capability.split(",").map((v) => v.trim())
|
|
136
130
|
: [];
|
|
137
131
|
if (config.walletContractAddress) {
|
|
138
|
-
const { signer } = await
|
|
139
|
-
const tx = await
|
|
132
|
+
const { signer } = await requireSigner(config);
|
|
133
|
+
const tx = await executeContractWriteViaWallet(config.walletContractAddress, signer, registryAddress, AGENT_REGISTRY_ABI, "update", [opts.name, capabilities, opts.serviceType, opts.endpoint ?? "", opts.metadataUri ?? ""]);
|
|
140
134
|
const receipt = await tx.wait();
|
|
141
|
-
console.log(
|
|
135
|
+
console.log(chalk.green(`✓ Agent updated`));
|
|
142
136
|
console.log(` Tx: ${receipt?.hash}`);
|
|
143
137
|
}
|
|
144
138
|
else {
|
|
145
|
-
const { signer } = await
|
|
146
|
-
const client = new
|
|
139
|
+
const { signer } = await requireSigner(config);
|
|
140
|
+
const client = new AgentRegistryClient(registryAddress, signer);
|
|
147
141
|
await client.update({ name: opts.name, serviceType: opts.serviceType, capabilities, endpoint: opts.endpoint, metadataURI: opts.metadataUri });
|
|
148
142
|
console.log("updated");
|
|
149
143
|
}
|
|
@@ -154,8 +148,8 @@ function registerAgentCommands(program) {
|
|
|
154
148
|
.description("Claim <subdomain>.arc402.xyz for this wallet (wallet must be registered in AgentRegistry)")
|
|
155
149
|
.requiredOption("--tunnel-target <url>", "Tunnel target URL (must start with https://)")
|
|
156
150
|
.action(async (subdomain, opts) => {
|
|
157
|
-
const config =
|
|
158
|
-
const walletAddress = config.walletContractAddress ?? new
|
|
151
|
+
const config = loadConfig();
|
|
152
|
+
const walletAddress = config.walletContractAddress ?? new ethers.Wallet(config.privateKey).address;
|
|
159
153
|
await claimSubdomain(subdomain, walletAddress, opts.tunnelTarget);
|
|
160
154
|
});
|
|
161
155
|
// ─── transfer-subdomain ──────────────────────────────────────────────────────
|
|
@@ -167,10 +161,10 @@ function registerAgentCommands(program) {
|
|
|
167
161
|
const normalized = subdomain.toLowerCase();
|
|
168
162
|
let newWallet;
|
|
169
163
|
try {
|
|
170
|
-
newWallet =
|
|
164
|
+
newWallet = ethers.getAddress(opts.newWallet);
|
|
171
165
|
}
|
|
172
166
|
catch {
|
|
173
|
-
console.error(
|
|
167
|
+
console.error(chalk.red(`Invalid address: ${opts.newWallet}`));
|
|
174
168
|
process.exit(1);
|
|
175
169
|
}
|
|
176
170
|
console.log(`\nTransferring subdomain: ${normalized}.arc402.xyz`);
|
|
@@ -183,10 +177,10 @@ function registerAgentCommands(program) {
|
|
|
183
177
|
});
|
|
184
178
|
const body = await res.json();
|
|
185
179
|
if (!res.ok) {
|
|
186
|
-
console.error(
|
|
180
|
+
console.error(chalk.red(`\n✗ Transfer failed (${res.status}): ${body["error"] ?? JSON.stringify(body)}`));
|
|
187
181
|
process.exit(1);
|
|
188
182
|
}
|
|
189
|
-
console.log(
|
|
183
|
+
console.log(chalk.green(`\n✓ Subdomain transferred: ${body["subdomain"]}`));
|
|
190
184
|
console.log(` New owner: ${body["newWalletAddress"]}`);
|
|
191
185
|
});
|
|
192
186
|
// ─── set-metadata ───────────────────────────────────────────────────────────
|
|
@@ -194,10 +188,10 @@ function registerAgentCommands(program) {
|
|
|
194
188
|
.command("set-metadata")
|
|
195
189
|
.description("Interactively build and upload ARC-402 agent metadata, then update the registry")
|
|
196
190
|
.action(async () => {
|
|
197
|
-
const config =
|
|
191
|
+
const config = loadConfig();
|
|
198
192
|
const registryAddress = getAgentRegistryAddress(config);
|
|
199
|
-
const { signer, address } = await
|
|
200
|
-
const client = new
|
|
193
|
+
const { signer, address } = await requireSigner(config);
|
|
194
|
+
const client = new AgentRegistryClient(registryAddress, signer);
|
|
201
195
|
// Resolve the on-chain identity (wallet contract or EOA)
|
|
202
196
|
const agentAddress = config.walletContractAddress ?? address;
|
|
203
197
|
let existingName = "";
|
|
@@ -222,15 +216,15 @@ function registerAgentCommands(program) {
|
|
|
222
216
|
}
|
|
223
217
|
catch { /* not yet registered */ }
|
|
224
218
|
if (config.walletContractAddress) {
|
|
225
|
-
const tx = await
|
|
219
|
+
const tx = await executeContractWriteViaWallet(config.walletContractAddress, signer, registryAddress, AGENT_REGISTRY_ABI, "update", [name, existingCaps, serviceType, endpoint, uri]);
|
|
226
220
|
const receipt = await tx.wait();
|
|
227
|
-
console.log(
|
|
221
|
+
console.log(chalk.green("✓ Metadata URI saved to registry"));
|
|
228
222
|
console.log(` ${uri}`);
|
|
229
223
|
console.log(` Tx: ${receipt?.hash}`);
|
|
230
224
|
}
|
|
231
225
|
else {
|
|
232
226
|
await client.update({ name, serviceType, capabilities: existingCaps, endpoint, metadataURI: uri });
|
|
233
|
-
console.log(
|
|
227
|
+
console.log(chalk.green("✓ Metadata URI saved to registry"));
|
|
234
228
|
console.log(` ${uri}`);
|
|
235
229
|
}
|
|
236
230
|
});
|
|
@@ -239,25 +233,25 @@ function registerAgentCommands(program) {
|
|
|
239
233
|
.command("show-metadata <address>")
|
|
240
234
|
.description("Fetch and display metadata for any registered agent")
|
|
241
235
|
.action(async (address) => {
|
|
242
|
-
const config =
|
|
236
|
+
const config = loadConfig();
|
|
243
237
|
const registryAddress = getAgentRegistryAddress(config);
|
|
244
|
-
const { provider } = await
|
|
245
|
-
const client = new
|
|
238
|
+
const { provider } = await getClient(config);
|
|
239
|
+
const client = new AgentRegistryClient(registryAddress, provider);
|
|
246
240
|
const info = await client.getAgent(address);
|
|
247
241
|
if (!info.metadataURI) {
|
|
248
|
-
console.log(
|
|
242
|
+
console.log(chalk.yellow("No metadata URI set for this agent."));
|
|
249
243
|
return;
|
|
250
244
|
}
|
|
251
|
-
console.log(
|
|
245
|
+
console.log(chalk.dim(`Fetching metadata from: ${info.metadataURI}\n`));
|
|
252
246
|
let meta;
|
|
253
247
|
try {
|
|
254
|
-
meta = await
|
|
248
|
+
meta = await decodeMetadata(info.metadataURI);
|
|
255
249
|
}
|
|
256
250
|
catch (err) {
|
|
257
|
-
console.error(
|
|
251
|
+
console.error(chalk.red(`Failed to fetch or parse metadata: ${err instanceof Error ? err.message : String(err)}`));
|
|
258
252
|
return;
|
|
259
253
|
}
|
|
260
|
-
console.log(
|
|
254
|
+
console.log(chalk.bold("Agent Metadata") + chalk.dim(` (${meta.schema})`));
|
|
261
255
|
if (meta.name)
|
|
262
256
|
console.log(` name: ${meta.name}`);
|
|
263
257
|
if (meta.description)
|
|
@@ -306,10 +300,10 @@ function registerAgentCommands(program) {
|
|
|
306
300
|
.command("deactivate")
|
|
307
301
|
.description("Deactivate your agent registration (preserves history/trust)")
|
|
308
302
|
.action(async () => {
|
|
309
|
-
const config =
|
|
303
|
+
const config = loadConfig();
|
|
310
304
|
const registryAddress = getAgentRegistryAddress(config);
|
|
311
|
-
const { signer } = await
|
|
312
|
-
const client = new
|
|
305
|
+
const { signer } = await requireSigner(config);
|
|
306
|
+
const client = new AgentRegistryClient(registryAddress, signer);
|
|
313
307
|
await client.deactivate();
|
|
314
308
|
console.log("agent deactivated");
|
|
315
309
|
});
|
|
@@ -317,10 +311,10 @@ function registerAgentCommands(program) {
|
|
|
317
311
|
.command("reactivate")
|
|
318
312
|
.description("Reactivate your agent registration")
|
|
319
313
|
.action(async () => {
|
|
320
|
-
const config =
|
|
314
|
+
const config = loadConfig();
|
|
321
315
|
const registryAddress = getAgentRegistryAddress(config);
|
|
322
|
-
const { signer } = await
|
|
323
|
-
const client = new
|
|
316
|
+
const { signer } = await requireSigner(config);
|
|
317
|
+
const client = new AgentRegistryClient(registryAddress, signer);
|
|
324
318
|
await client.reactivate();
|
|
325
319
|
console.log("agent reactivated");
|
|
326
320
|
});
|
|
@@ -330,10 +324,10 @@ function registerAgentCommands(program) {
|
|
|
330
324
|
.description("Submit self-reported heartbeat data")
|
|
331
325
|
.option("--latency-ms <n>", "Observed latency", "0")
|
|
332
326
|
.action(async (opts) => {
|
|
333
|
-
const config =
|
|
327
|
+
const config = loadConfig();
|
|
334
328
|
const registryAddress = getAgentRegistryAddress(config);
|
|
335
|
-
const { signer } = await
|
|
336
|
-
const client = new
|
|
329
|
+
const { signer } = await requireSigner(config);
|
|
330
|
+
const client = new AgentRegistryClient(registryAddress, signer);
|
|
337
331
|
await client.submitHeartbeat(Number(opts.latencyMs));
|
|
338
332
|
console.log("heartbeat submitted");
|
|
339
333
|
});
|
|
@@ -343,10 +337,10 @@ function registerAgentCommands(program) {
|
|
|
343
337
|
.requiredOption("--interval <seconds>")
|
|
344
338
|
.requiredOption("--grace <seconds>")
|
|
345
339
|
.action(async (opts) => {
|
|
346
|
-
const config =
|
|
340
|
+
const config = loadConfig();
|
|
347
341
|
const registryAddress = getAgentRegistryAddress(config);
|
|
348
|
-
const { signer } = await
|
|
349
|
-
const client = new
|
|
342
|
+
const { signer } = await requireSigner(config);
|
|
343
|
+
const client = new AgentRegistryClient(registryAddress, signer);
|
|
350
344
|
await client.setHeartbeatPolicy(Number(opts.interval), Number(opts.grace));
|
|
351
345
|
console.log("heartbeat policy updated");
|
|
352
346
|
});
|
|
@@ -355,10 +349,10 @@ function registerAgentCommands(program) {
|
|
|
355
349
|
.command("info <address>")
|
|
356
350
|
.option("--json")
|
|
357
351
|
.action(async (address, opts) => {
|
|
358
|
-
const config =
|
|
352
|
+
const config = loadConfig();
|
|
359
353
|
const registryAddress = getAgentRegistryAddress(config);
|
|
360
|
-
const { provider } = await
|
|
361
|
-
const client = new
|
|
354
|
+
const { provider } = await getClient(config);
|
|
355
|
+
const client = new AgentRegistryClient(registryAddress, provider);
|
|
362
356
|
const [info, ops] = await Promise.all([
|
|
363
357
|
client.getAgent(address),
|
|
364
358
|
client.getOperationalMetrics(address),
|
|
@@ -373,13 +367,13 @@ function registerAgentCommands(program) {
|
|
|
373
367
|
operational: Object.fromEntries(Object.entries(ops).map(([k, v]) => [k, Number(v)])),
|
|
374
368
|
}, null, 2));
|
|
375
369
|
}
|
|
376
|
-
console.log(`${info.name} ${info.wallet}\nservice=${info.serviceType}\ntrust=${Number(info.trustScore ?? 0n)} (${
|
|
370
|
+
console.log(`${info.name} ${info.wallet}\nservice=${info.serviceType}\ntrust=${Number(info.trustScore ?? 0n)} (${getTrustTier(Number(info.trustScore ?? 0n))})\nregistered=${formatDate(Number(info.registeredAt))}\nheartbeatCount=${Number(ops.heartbeatCount)} uptimeScore=${Number(ops.uptimeScore)} responseScore=${Number(ops.responseScore)}`);
|
|
377
371
|
});
|
|
378
372
|
agent
|
|
379
373
|
.command("me")
|
|
380
374
|
.action(async () => {
|
|
381
|
-
const config =
|
|
382
|
-
const address = config.walletContractAddress ?? (await
|
|
375
|
+
const config = loadConfig();
|
|
376
|
+
const address = config.walletContractAddress ?? (await getClient(config)).address;
|
|
383
377
|
if (!address)
|
|
384
378
|
throw new Error("No wallet configured");
|
|
385
379
|
await program.parseAsync([process.argv[0], process.argv[1], "agent", "info", address], { from: "user" });
|
|
@@ -423,7 +417,7 @@ function registerAgentCommands(program) {
|
|
|
423
417
|
console.log(JSON.stringify({ error: "Agent not registered", address }));
|
|
424
418
|
}
|
|
425
419
|
else {
|
|
426
|
-
console.log(
|
|
420
|
+
console.log(chalk.red(`Agent not registered: ${address}`));
|
|
427
421
|
}
|
|
428
422
|
process.exit(1);
|
|
429
423
|
}
|
|
@@ -477,14 +471,14 @@ function registerAgentCommands(program) {
|
|
|
477
471
|
const vouchedFor = data["vouchedFor"] ?? [];
|
|
478
472
|
const vouchedBy = data["vouchedBy"] ?? [];
|
|
479
473
|
const line = "═".repeat(43);
|
|
480
|
-
console.log(
|
|
481
|
-
console.log(` ${
|
|
474
|
+
console.log(chalk.bold(line));
|
|
475
|
+
console.log(` ${chalk.bold(agentData["name"] || "(unnamed)")}`);
|
|
482
476
|
console.log(` ${agentData["id"]}`);
|
|
483
|
-
console.log(
|
|
477
|
+
console.log(chalk.bold(line));
|
|
484
478
|
console.log();
|
|
485
479
|
console.log(` Service Type: ${agentData["serviceType"]}`);
|
|
486
|
-
console.log(` Endpoint: ${agentData["endpoint"] ||
|
|
487
|
-
console.log(` Status: ${agentData["active"] ?
|
|
480
|
+
console.log(` Endpoint: ${agentData["endpoint"] || chalk.dim("(none)")}`);
|
|
481
|
+
console.log(` Status: ${agentData["active"] ? chalk.green("✅ Active") : chalk.red("❌ Inactive")}`);
|
|
488
482
|
console.log(` Trust Score: ${trustScore}`);
|
|
489
483
|
console.log();
|
|
490
484
|
if (caps.length > 0) {
|
|
@@ -523,7 +517,7 @@ function registerAgentCommands(program) {
|
|
|
523
517
|
console.log(JSON.stringify({ error: "Subgraph unavailable", details: msg }));
|
|
524
518
|
}
|
|
525
519
|
else {
|
|
526
|
-
console.error(
|
|
520
|
+
console.error(chalk.red(`Subgraph unavailable: ${msg}`));
|
|
527
521
|
}
|
|
528
522
|
process.exit(1);
|
|
529
523
|
}
|
|
@@ -564,15 +558,15 @@ async function claimSubdomain(subdomain, walletAddress, tunnelTarget) {
|
|
|
564
558
|
});
|
|
565
559
|
const body = await res.json();
|
|
566
560
|
if (!res.ok) {
|
|
567
|
-
console.error(
|
|
561
|
+
console.error(chalk.red(`✗ Subdomain claim failed (${res.status}): ${body["error"] ?? JSON.stringify(body)}`));
|
|
568
562
|
process.exit(1);
|
|
569
563
|
}
|
|
570
|
-
console.log(
|
|
564
|
+
console.log(chalk.green(`✓ Subdomain claimed: ${body["subdomain"]}`));
|
|
571
565
|
}
|
|
572
566
|
// ─── metadata wizard ──────────────────────────────────────────────────────────
|
|
573
567
|
async function runSetMetadataWizard(defaultName, defaultCapabilities) {
|
|
574
|
-
console.log(
|
|
575
|
-
const answers = await (
|
|
568
|
+
console.log(chalk.bold("\nARC-402 Agent Metadata Wizard\n"));
|
|
569
|
+
const answers = await prompts([
|
|
576
570
|
{ type: "text", name: "name", message: "Agent name:", initial: defaultName },
|
|
577
571
|
{ type: "text", name: "description", message: "Short description (what does this agent do?):" },
|
|
578
572
|
{ type: "text", name: "capabilities", message: "Capabilities (comma-separated, e.g. legal.patent-analysis.us.v1):", initial: defaultCapabilities.join(", ") },
|
|
@@ -584,13 +578,13 @@ async function runSetMetadataWizard(defaultName, defaultCapabilities) {
|
|
|
584
578
|
{ type: "confirm", name: "envLeakProtection", message: "Does this agent have env/key leak protection in its instructions?", initial: false },
|
|
585
579
|
]);
|
|
586
580
|
if (!answers.name) {
|
|
587
|
-
console.log(
|
|
581
|
+
console.log(chalk.dim("Cancelled."));
|
|
588
582
|
return "";
|
|
589
583
|
}
|
|
590
584
|
const capabilities = answers.capabilities
|
|
591
585
|
? answers.capabilities.split(",").map((v) => v.trim()).filter(Boolean)
|
|
592
586
|
: [];
|
|
593
|
-
const meta =
|
|
587
|
+
const meta = buildMetadata({
|
|
594
588
|
name: answers.name || undefined,
|
|
595
589
|
description: answers.description || undefined,
|
|
596
590
|
capabilities: capabilities.length ? capabilities : undefined,
|
|
@@ -607,14 +601,14 @@ async function runSetMetadataWizard(defaultName, defaultCapabilities) {
|
|
|
607
601
|
});
|
|
608
602
|
const pinataJwt = process.env["PINATA_JWT"];
|
|
609
603
|
if (!pinataJwt) {
|
|
610
|
-
console.log(
|
|
611
|
-
console.log(
|
|
604
|
+
console.log(chalk.dim("\nNo PINATA_JWT env var found — metadata will be stored as a data URI."));
|
|
605
|
+
console.log(chalk.dim("To pin to IPFS: export PINATA_JWT=<your-jwt> and re-run.\n"));
|
|
612
606
|
}
|
|
613
607
|
else {
|
|
614
|
-
console.log(
|
|
608
|
+
console.log(chalk.dim("\nUploading to IPFS via Pinata…"));
|
|
615
609
|
}
|
|
616
|
-
const uri = await
|
|
617
|
-
console.log(
|
|
610
|
+
const uri = await uploadMetadata(meta, pinataJwt);
|
|
611
|
+
console.log(chalk.green(`✓ Metadata URI: ${uri}`));
|
|
618
612
|
return uri;
|
|
619
613
|
}
|
|
620
614
|
//# sourceMappingURL=agent.js.map
|