@prktsol/prkt 1.0.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.
Files changed (125) hide show
  1. package/.env.devnet.all-protocols.example +18 -0
  2. package/.env.devnet.autonomous.example +16 -0
  3. package/.env.devnet.jupiter.example +16 -0
  4. package/.env.devnet.kamino.example +17 -0
  5. package/.env.devnet.marinade.example +16 -0
  6. package/.env.devnet.orca.example +16 -0
  7. package/.env.devnet.raydium.example +17 -0
  8. package/.env.example +32 -0
  9. package/ARCHITECTURE.md +159 -0
  10. package/CLI.md +509 -0
  11. package/CLI_QUICKSTART.md +108 -0
  12. package/COMPATIBILITY.md +103 -0
  13. package/DEVNET_PROTOCOL_ADDRESSES.md +72 -0
  14. package/README.md +339 -0
  15. package/dist/agent/AgentManager.js +166 -0
  16. package/dist/agent/AgentRuntime.js +92 -0
  17. package/dist/agent/DecisionEngine.js +95 -0
  18. package/dist/agent/MockPriceFeed.js +13 -0
  19. package/dist/agent/intents/types.js +2 -0
  20. package/dist/agent/new-index.js +17 -0
  21. package/dist/agent/policyFactory.js +54 -0
  22. package/dist/agent/registry/AgentRegistry.js +16 -0
  23. package/dist/agent/runner/AgentRunner.js +266 -0
  24. package/dist/agent/strategies/MemoHeartbeatStrategy.js +15 -0
  25. package/dist/agent/strategies/SimpleScriptedTransferStrategy.js +27 -0
  26. package/dist/agent/strategies/TokenRebalancerStrategy.js +35 -0
  27. package/dist/agent/strategies/TreasuryDistributorStrategy.js +29 -0
  28. package/dist/agent/strategies/UniversalDeFiStrategy.js +19 -0
  29. package/dist/agent/types/AgentContext.js +2 -0
  30. package/dist/cli/index.js +1159 -0
  31. package/dist/cli/services/activityStore.js +42 -0
  32. package/dist/cli/services/agentRegistry.js +123 -0
  33. package/dist/cli/services/agentRuntime.js +55 -0
  34. package/dist/cli/services/storagePaths.js +64 -0
  35. package/dist/cli/services/strategyFactory.js +66 -0
  36. package/dist/cli/services/walletCrypto.js +120 -0
  37. package/dist/cli/services/walletRegistry.js +145 -0
  38. package/dist/cli/types.js +2 -0
  39. package/dist/cli/utils/completion.js +62 -0
  40. package/dist/cli/utils/output.js +44 -0
  41. package/dist/config/agentPolicies.js +37 -0
  42. package/dist/config/env.js +249 -0
  43. package/dist/config/policyPresets.js +105 -0
  44. package/dist/core/balances/BalanceService.js +34 -0
  45. package/dist/core/funding/DevnetFundingService.js +105 -0
  46. package/dist/core/idempotency/ExecutionIdempotencyGuard.js +100 -0
  47. package/dist/core/index.js +19 -0
  48. package/dist/core/rpc/RpcClient.js +45 -0
  49. package/dist/core/rpc/RpcFailoverClient.js +97 -0
  50. package/dist/core/tokens/TokenService.js +75 -0
  51. package/dist/core/transactions/PostTransactionVerifier.js +103 -0
  52. package/dist/core/transactions/TransactionService.js +104 -0
  53. package/dist/core/types/services.js +2 -0
  54. package/dist/core/wallet/WalletManager.js +120 -0
  55. package/dist/defi/DeFiCoordinator.js +93 -0
  56. package/dist/defi/DeFiExecutor.js +29 -0
  57. package/dist/defi/DeFiPolicyGuard.js +31 -0
  58. package/dist/defi/adapters/JupiterAdapter.js +25 -0
  59. package/dist/defi/adapters/KaminoAdapter.js +50 -0
  60. package/dist/defi/adapters/MarinadeAdapter.js +25 -0
  61. package/dist/defi/adapters/RaydiumAdapter.js +45 -0
  62. package/dist/defi/kamino/kaminoInstructionCompat.js +24 -0
  63. package/dist/defi/kamino/kaminoLiveConfig.js +60 -0
  64. package/dist/defi/kamino/loadKaminoMarketWithFallback.js +68 -0
  65. package/dist/defi/lp/LpInstructionBuilder.js +2 -0
  66. package/dist/defi/lp/RaydiumLpInstructionBuilder.js +100 -0
  67. package/dist/defi/lp/raydiumDevnetConfig.js +62 -0
  68. package/dist/defi/protocols.js +29 -0
  69. package/dist/defi/types.js +2 -0
  70. package/dist/defi/universal/UniversalDeFiOrchestrator.js +126 -0
  71. package/dist/defi/universal/adapters.js +73 -0
  72. package/dist/defi/universal/index.js +5 -0
  73. package/dist/defi/universal/liveExecutors.js +394 -0
  74. package/dist/defi/universal/types.js +2 -0
  75. package/dist/demo/scenarios/multiAgentDevnetScenario.js +170 -0
  76. package/dist/demo/scripts/runMultiAgentDevnetDemo.js +17 -0
  77. package/dist/dex/JupiterSwapClient.js +59 -0
  78. package/dist/dex/SwapExecutor.js +52 -0
  79. package/dist/index.js +22 -0
  80. package/dist/kora/KoraRpcClient.js +60 -0
  81. package/dist/kora/KoraSigner.js +57 -0
  82. package/dist/kora/gaslessDemo.js +18 -0
  83. package/dist/policy/PolicyGuard.js +158 -0
  84. package/dist/policy/emergencyLock.js +164 -0
  85. package/dist/policy/engine/PolicyEngine.js +237 -0
  86. package/dist/policy/errors.js +10 -0
  87. package/dist/policy/index.js +7 -0
  88. package/dist/policy/sandbox/SandboxExecutor.js +77 -0
  89. package/dist/policy/types/policy.js +2 -0
  90. package/dist/scripts/devnetFunding.js +28 -0
  91. package/dist/scripts/devnetWalletPreflight.js +16 -0
  92. package/dist/scripts/localnetCheck.js +27 -0
  93. package/dist/scripts/managedAgentWallet.js +81 -0
  94. package/dist/scripts/mode.js +6 -0
  95. package/dist/scripts/releaseReadiness.js +93 -0
  96. package/dist/scripts/runAgentUniversalDeFi.js +115 -0
  97. package/dist/scripts/runAutonomousAgentWalletDevnet.js +154 -0
  98. package/dist/scripts/runAutonomousPortfolioDevnet.js +390 -0
  99. package/dist/scripts/runBorrowStrategy.js +35 -0
  100. package/dist/scripts/runDeFiSuite.js +41 -0
  101. package/dist/scripts/runDemoRehearsal.js +111 -0
  102. package/dist/scripts/runDevnetWalletDemo.js +53 -0
  103. package/dist/scripts/runGaslessMemo.js +23 -0
  104. package/dist/scripts/runGaslessWalletDemo.js +60 -0
  105. package/dist/scripts/runKaminoDevnet.js +109 -0
  106. package/dist/scripts/runLpStrategy.js +32 -0
  107. package/dist/scripts/runMarinadeDevnet.js +97 -0
  108. package/dist/scripts/runOrcaLpDevnet.js +208 -0
  109. package/dist/scripts/runRaydiumLpDevnet.js +95 -0
  110. package/dist/scripts/runReleaseReadiness.js +22 -0
  111. package/dist/scripts/runStakeStrategy.js +33 -0
  112. package/dist/scripts/runStressTest.js +41 -0
  113. package/dist/scripts/runTradeLoop.js +53 -0
  114. package/dist/scripts/runUniversalDeFiDemo.js +84 -0
  115. package/dist/scripts/runYieldStrategy.js +33 -0
  116. package/dist/scripts/runtimeFactory.js +27 -0
  117. package/dist/scripts/shared.js +24 -0
  118. package/dist/scripts/simulateAttack.js +40 -0
  119. package/dist/scripts/simulateSwarm.js +106 -0
  120. package/dist/simulation/attack.js +30 -0
  121. package/dist/solana/programs.js +9 -0
  122. package/dist/spl/TokenWallet.js +65 -0
  123. package/dist/types/policy.js +2 -0
  124. package/dist/wallet/WalletManager.js +5 -0
  125. package/package.json +99 -0
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runCommandCheck = runCommandCheck;
4
+ exports.evaluateProductionTodo = evaluateProductionTodo;
5
+ exports.findOpenBlockingTodoItems = findOpenBlockingTodoItems;
6
+ exports.runReadinessChecks = runReadinessChecks;
7
+ const fs_1 = require("fs");
8
+ const child_process_1 = require("child_process");
9
+ const BLOCKING_TODO_SECTION_PREFIXES = [
10
+ "## P0 Blockers",
11
+ "## P1 Security Hardening",
12
+ "## P1 End-to-End Live Paths",
13
+ "## P0 Test and Release Gates",
14
+ "## Mainnet Deployment Gate"
15
+ ];
16
+ function runCommandCheck(command, args) {
17
+ const result = (0, child_process_1.spawnSync)([command, ...args].join(" "), {
18
+ shell: true,
19
+ stdio: "inherit"
20
+ });
21
+ return {
22
+ detail: `${command} ${args.join(" ")}`,
23
+ ok: result.status === 0,
24
+ title: `Command ${command}`
25
+ };
26
+ }
27
+ function evaluateProductionTodo(todoPath = "PRODUCTION_READINESS_TODO.md") {
28
+ if (!(0, fs_1.existsSync)(todoPath)) {
29
+ return {
30
+ detail: todoPath,
31
+ ok: false,
32
+ title: "Production TODO present"
33
+ };
34
+ }
35
+ const blockingItems = findOpenBlockingTodoItems((0, fs_1.readFileSync)(todoPath, "utf8"));
36
+ if (blockingItems.length === 0) {
37
+ return {
38
+ detail: "No open P0/P1/mainnet deployment blockers",
39
+ ok: true,
40
+ title: "Production blockers cleared"
41
+ };
42
+ }
43
+ return {
44
+ detail: blockingItems.join(" | "),
45
+ ok: false,
46
+ title: "Production blockers cleared"
47
+ };
48
+ }
49
+ function findOpenBlockingTodoItems(markdown) {
50
+ const openItems = [];
51
+ let currentSection = "";
52
+ for (const rawLine of markdown.split(/\r?\n/u)) {
53
+ const line = rawLine.trim();
54
+ if (line.startsWith("## ")) {
55
+ currentSection = line;
56
+ continue;
57
+ }
58
+ if (!BLOCKING_TODO_SECTION_PREFIXES.some((section) => currentSection.startsWith(section))) {
59
+ continue;
60
+ }
61
+ const match = line.match(/^- \[ \] (.+)$/u);
62
+ if (!match) {
63
+ continue;
64
+ }
65
+ openItems.push(`${currentSection.replace(/^## /u, "")}: ${match[1]}`);
66
+ }
67
+ return openItems;
68
+ }
69
+ function runReadinessChecks() {
70
+ const npmCommand = "npm";
71
+ const checks = [];
72
+ checks.push({
73
+ detail: ".env.example",
74
+ ok: (0, fs_1.existsSync)(".env.example"),
75
+ title: "Env template present"
76
+ });
77
+ checks.push({
78
+ detail: "SKILLS.md",
79
+ ok: (0, fs_1.existsSync)("SKILLS.md"),
80
+ title: "Agent skills file present"
81
+ });
82
+ checks.push({
83
+ detail: "README.md",
84
+ ok: (0, fs_1.existsSync)("README.md"),
85
+ title: "README present"
86
+ });
87
+ checks.push(evaluateProductionTodo());
88
+ checks.push(runCommandCheck(npmCommand, ["run", "build"]));
89
+ checks.push(runCommandCheck("node", ["dist/cli/index.js", "--help"]));
90
+ checks.push(runCommandCheck(npmCommand, ["run", "test:coverage"]));
91
+ checks.push(runCommandCheck(npmCommand, ["pack", "--dry-run", "--cache", ".npm-cache"]));
92
+ return checks;
93
+ }
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const web3_js_1 = require("@solana/web3.js");
4
+ const AgentRunner_1 = require("../agent/runner/AgentRunner");
5
+ const UniversalDeFiStrategy_1 = require("../agent/strategies/UniversalDeFiStrategy");
6
+ const agentPolicies_1 = require("../config/agentPolicies");
7
+ const env_1 = require("../config/env");
8
+ const BalanceService_1 = require("../core/balances/BalanceService");
9
+ const RpcClient_1 = require("../core/rpc/RpcClient");
10
+ const TokenService_1 = require("../core/tokens/TokenService");
11
+ const TransactionService_1 = require("../core/transactions/TransactionService");
12
+ const universal_1 = require("../defi/universal");
13
+ const managedAgentWallet_1 = require("./managedAgentWallet");
14
+ const mode_1 = require("./mode");
15
+ const shared_1 = require("./shared");
16
+ const DEFAULT_AGENT_NAME = "agent-universal-defi";
17
+ async function main() {
18
+ (0, mode_1.printDemoMode)("SIMULATED", "AgentRunner universal DeFi flow (agent emits trade/lp/lending/borrowing/yield/staking intents)");
19
+ const rpcClient = new RpcClient_1.RpcClient((0, env_1.getRpcUrl)(), "confirmed");
20
+ const transactionService = new TransactionService_1.TransactionService(rpcClient);
21
+ const tokenService = new TokenService_1.TokenService(rpcClient);
22
+ const managed = (0, managedAgentWallet_1.resolveManagedAgentWallet)({
23
+ agentName: (0, managedAgentWallet_1.getManagedAgentName)({
24
+ defaultAgentName: DEFAULT_AGENT_NAME,
25
+ env: process.env
26
+ }),
27
+ ownerId: (0, managedAgentWallet_1.getManagedOwnerId)(process.env)
28
+ });
29
+ const walletManager = managed.walletManager;
30
+ const balanceService = new BalanceService_1.BalanceService(rpcClient, tokenService);
31
+ const koraSigner = (0, shared_1.createKoraSigner)();
32
+ const universalDeFi = new universal_1.UniversalDeFiOrchestrator({
33
+ koraSigner,
34
+ liveFirst: false,
35
+ logger: (message) => console.log(`[universal-defi] ${message}`),
36
+ walletManager
37
+ });
38
+ const runner = new AgentRunner_1.AgentRunner();
39
+ const agentId = managed.agent.name;
40
+ (0, managedAgentWallet_1.logManagedAgentWallet)(managed);
41
+ runner.registerAgent({
42
+ context: {
43
+ id: agentId,
44
+ walletManager,
45
+ walletPublicKey: walletManager.publicKey,
46
+ rpcClient,
47
+ transactionService,
48
+ tokenService,
49
+ balanceService,
50
+ policyConfig: (0, agentPolicies_1.createDefaultPolicyConfig)({
51
+ agentId
52
+ }),
53
+ logger: (message) => console.log(`[${agentId}] ${message}`),
54
+ universalDeFiExecutor: universalDeFi
55
+ },
56
+ strategy: new UniversalDeFiStrategy_1.UniversalDeFiStrategy([
57
+ {
58
+ capability: "trade",
59
+ snapshot: {
60
+ buyThresholdUsd: 100,
61
+ solPriceUsd: 95
62
+ }
63
+ },
64
+ {
65
+ capability: "staking",
66
+ snapshot: {
67
+ idleSolLamports: Math.round(1.0 * web3_js_1.LAMPORTS_PER_SOL)
68
+ }
69
+ },
70
+ {
71
+ capability: "lp",
72
+ snapshot: {
73
+ liquidityInRange: true
74
+ }
75
+ },
76
+ {
77
+ capability: "lending",
78
+ snapshot: {
79
+ healthFactor: 2.0,
80
+ idleUsdcAtomic: 5_000_000
81
+ }
82
+ },
83
+ {
84
+ capability: "borrowing",
85
+ protocol: "kamino",
86
+ snapshot: {
87
+ borrowDemandUsdcAtomic: 3_000_000,
88
+ collateralSolLamports: Math.round(1.2 * web3_js_1.LAMPORTS_PER_SOL),
89
+ healthFactor: 2.3
90
+ }
91
+ },
92
+ {
93
+ capability: "yield",
94
+ protocol: "raydium",
95
+ snapshot: {
96
+ rewardsClaimableAtomic: 750_000
97
+ }
98
+ }
99
+ ])
100
+ });
101
+ const result = await runner.runOnceParallel();
102
+ console.log("Agent universal DeFi run complete.");
103
+ for (const agent of result) {
104
+ for (const outcome of agent.outcomes) {
105
+ const intentType = outcome.intent.type;
106
+ const suffix = outcome.signature ? `signature=${outcome.signature}` : "HOLD";
107
+ console.log(`${agent.agentId} ${intentType} -> ${suffix}`);
108
+ }
109
+ }
110
+ }
111
+ main().catch((error) => {
112
+ const message = error instanceof Error ? error.message : "Unknown error";
113
+ console.error(`Agent universal DeFi run failed: ${message}`);
114
+ process.exitCode = 1;
115
+ });
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const marinade_ts_sdk_1 = require("@marinade.finance/marinade-ts-sdk");
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ const AgentRunner_1 = require("../agent/runner/AgentRunner");
6
+ const UniversalDeFiStrategy_1 = require("../agent/strategies/UniversalDeFiStrategy");
7
+ const agentPolicies_1 = require("../config/agentPolicies");
8
+ const env_1 = require("../config/env");
9
+ const BalanceService_1 = require("../core/balances/BalanceService");
10
+ const DevnetFundingService_1 = require("../core/funding/DevnetFundingService");
11
+ const RpcClient_1 = require("../core/rpc/RpcClient");
12
+ const TokenService_1 = require("../core/tokens/TokenService");
13
+ const TransactionService_1 = require("../core/transactions/TransactionService");
14
+ const universal_1 = require("../defi/universal");
15
+ const managedAgentWallet_1 = require("./managedAgentWallet");
16
+ const mode_1 = require("./mode");
17
+ const shared_1 = require("./shared");
18
+ const DEFAULT_AGENT_NAME = "agent-autonomous-wallet";
19
+ const REQUIRED_FUNDING_SOL = 0.5;
20
+ const DEFAULT_STAKE_SOL = 0.15;
21
+ async function main() {
22
+ (0, mode_1.printDemoMode)("LIVE", "Autonomous agent wallet: provision or load the assigned agent wallet, fund on devnet, execute live Marinade stake, and verify owner stop control");
23
+ const rpcUrl = (0, env_1.getRpcUrl)();
24
+ const cluster = (0, env_1.detectClusterFromRpcUrl)(rpcUrl);
25
+ if (cluster !== "devnet") {
26
+ throw new Error(`Autonomous agent wallet demo requires devnet. Current RPC cluster is ${cluster} (${rpcUrl}).`);
27
+ }
28
+ const rpcClient = new RpcClient_1.RpcClient(rpcUrl, "confirmed");
29
+ const tokenService = new TokenService_1.TokenService(rpcClient);
30
+ const balanceService = new BalanceService_1.BalanceService(rpcClient, tokenService);
31
+ const transactionService = new TransactionService_1.TransactionService(rpcClient);
32
+ const fundingService = new DevnetFundingService_1.DevnetFundingService(rpcClient, transactionService);
33
+ const managed = (0, managedAgentWallet_1.resolveManagedAgentWallet)({
34
+ agentName: (0, managedAgentWallet_1.getManagedAgentName)({
35
+ defaultAgentName: DEFAULT_AGENT_NAME,
36
+ env: process.env
37
+ }),
38
+ ownerId: (0, managedAgentWallet_1.getManagedOwnerId)(process.env)
39
+ });
40
+ const walletManager = managed.walletManager;
41
+ const logger = (0, shared_1.createRuntimeLogger)("autonomous-agent");
42
+ const agentId = managed.agent.name;
43
+ console.log("PRKT autonomous agent wallet demo");
44
+ console.log(`RPC: ${rpcUrl}`);
45
+ (0, managedAgentWallet_1.logManagedAgentWallet)(managed);
46
+ await (0, managedAgentWallet_1.ensureManagedAgentWalletFunding)({
47
+ balanceService,
48
+ fundingService,
49
+ minimumSol: REQUIRED_FUNDING_SOL,
50
+ publicKey: walletManager.publicKey
51
+ });
52
+ const marinade = new marinade_ts_sdk_1.Marinade(new marinade_ts_sdk_1.MarinadeConfig({
53
+ connection: rpcClient.connection,
54
+ publicKey: walletManager.publicKey
55
+ }));
56
+ const marinadeState = await marinade.getMarinadeState();
57
+ const msolMint = marinadeState.mSolMintAddress;
58
+ const solBefore = await balanceService.getSolBalance(walletManager.publicKey);
59
+ const msolBefore = await balanceService.getSplTokenBalance({
60
+ mint: msolMint,
61
+ owner: walletManager.publicKey
62
+ });
63
+ const koraSigner = (0, shared_1.createKoraSigner)();
64
+ const universalDeFi = new universal_1.UniversalDeFiOrchestrator({
65
+ koraSigner,
66
+ liveFirst: true,
67
+ logger,
68
+ walletManager
69
+ });
70
+ const runner = new AgentRunner_1.AgentRunner();
71
+ runner.registerAgent({
72
+ context: {
73
+ id: agentId,
74
+ walletManager,
75
+ walletPublicKey: walletManager.publicKey,
76
+ rpcClient,
77
+ transactionService,
78
+ tokenService,
79
+ balanceService,
80
+ policyConfig: (0, agentPolicies_1.createDefaultPolicyConfig)({
81
+ agentId,
82
+ maxSolPerTxLamports: Math.round(0.3 * web3_js_1.LAMPORTS_PER_SOL),
83
+ maxTransactionsPerDay: 10,
84
+ maxTransactionsPerSession: 3
85
+ }),
86
+ logger,
87
+ universalDeFiExecutor: universalDeFi
88
+ },
89
+ strategy: new UniversalDeFiStrategy_1.UniversalDeFiStrategy([
90
+ {
91
+ capability: "staking",
92
+ protocol: "marinade",
93
+ snapshot: {
94
+ idleSolLamports: Math.round(solBefore * web3_js_1.LAMPORTS_PER_SOL)
95
+ }
96
+ }
97
+ ]),
98
+ approvalMode: "sandbox"
99
+ });
100
+ const [runResult] = await runner.runOnceParallel();
101
+ if (!runResult) {
102
+ throw new Error("Autonomous agent run did not produce a result.");
103
+ }
104
+ const [stakeOutcome] = runResult.outcomes;
105
+ if (!stakeOutcome) {
106
+ throw new Error("Autonomous agent produced no staking outcome.");
107
+ }
108
+ if (!stakeOutcome.allowed || !stakeOutcome.signature) {
109
+ throw new Error(`Autonomous stake was blocked: ${stakeOutcome.reasons.join("; ") || "unknown reason"}`);
110
+ }
111
+ const solAfter = await balanceService.getSolBalance(walletManager.publicKey);
112
+ const msolAfter = await balanceService.getSplTokenBalance({
113
+ mint: msolMint,
114
+ owner: walletManager.publicKey
115
+ });
116
+ if (msolAfter <= msolBefore) {
117
+ throw new Error(`Autonomous stake verification failed: mSOL did not increase (${msolBefore.toFixed(6)} -> ${msolAfter.toFixed(6)}).`);
118
+ }
119
+ console.log("");
120
+ console.log("Autonomous run");
121
+ console.log(`Agent: ${agentId}`);
122
+ console.log(`Intent: stake ${DEFAULT_STAKE_SOL.toFixed(2)} SOL via Marinade`);
123
+ console.log(`Signature: ${stakeOutcome.signature}`);
124
+ console.log(`SOL before: ${solBefore.toFixed(4)}`);
125
+ console.log(`SOL after: ${solAfter.toFixed(4)}`);
126
+ console.log(`mSOL before: ${msolBefore.toFixed(6)}`);
127
+ console.log(`mSOL after: ${msolAfter.toFixed(6)}`);
128
+ const originalEmergencyLock = process.env.POLICY_EMERGENCY_LOCK;
129
+ process.env.POLICY_EMERGENCY_LOCK = "true";
130
+ try {
131
+ const [lockedRun] = await runner.runOnceParallel();
132
+ const [lockedOutcome] = lockedRun?.outcomes ?? [];
133
+ if (!lockedOutcome || lockedOutcome.allowed) {
134
+ throw new Error("Emergency lock supervision check failed: agent execution was not blocked.");
135
+ }
136
+ console.log("");
137
+ console.log("Owner supervision");
138
+ console.log("Emergency lock engaged via POLICY_EMERGENCY_LOCK=true");
139
+ console.log(`Blocked reasons: ${lockedOutcome.reasons.join("; ")}`);
140
+ }
141
+ finally {
142
+ if (originalEmergencyLock === undefined) {
143
+ delete process.env.POLICY_EMERGENCY_LOCK;
144
+ }
145
+ else {
146
+ process.env.POLICY_EMERGENCY_LOCK = originalEmergencyLock;
147
+ }
148
+ }
149
+ }
150
+ main().catch((error) => {
151
+ const message = error instanceof Error ? error.message : "Unknown error";
152
+ console.error(`Autonomous agent wallet demo failed: ${message}`);
153
+ process.exitCode = 1;
154
+ });