@pushchain/core 6.0.27-alpha.0 → 6.0.27-alpha.1
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/AGW.md +49 -17
- package/CHANGELOG.md +10 -0
- package/package.json +1 -1
- package/src/lib/agentic/agentic.types.d.ts +8 -3
- package/src/lib/agentic/capabilities.d.ts +1 -1
- package/src/lib/agentic/capabilities.js +1 -1
- package/src/lib/agentic/codec/abi-layout.d.ts +5 -0
- package/src/lib/agentic/codec/abi-layout.js +50 -3
- package/src/lib/agentic/codec/defaults.d.ts +2 -2
- package/src/lib/agentic/codec/defaults.js +2 -2
- package/src/lib/agentic/codec/ids.d.ts +1 -1
- package/src/lib/agentic/codec/ids.js +1 -1
- package/src/lib/agentic/codec/native.d.ts +4 -6
- package/src/lib/agentic/codec/native.js +27 -14
- package/src/lib/agentic/codec/pins.d.ts +20 -0
- package/src/lib/agentic/codec/pins.js +29 -0
- package/src/lib/agentic/codec/rules.d.ts +1 -1
- package/src/lib/agentic/codec/rules.js +3 -3
- package/src/lib/agentic/codec/session.d.ts +2 -2
- package/src/lib/agentic/codec/session.js +3 -3
- package/src/lib/agentic/codec/svm-terms.d.ts +1 -1
- package/src/lib/agentic/codec/svm-terms.js +7 -3
- package/src/lib/agentic/codec/universal-terms.d.ts +15 -0
- package/src/lib/agentic/codec/universal-terms.js +2 -0
- package/src/lib/agentic/codec/universal.js +22 -6
- package/src/lib/agentic/constants.d.ts +1 -0
- package/src/lib/agentic/constants.js +1 -0
- package/src/lib/agentic/contracts/abi/{v5 → v6}/agent-validator.js +1 -1
- package/src/lib/agentic/contracts/abi/{v5 → v6}/agw-factory.d.ts +299 -0
- package/src/lib/agentic/contracts/abi/{v5 → v6}/agw-factory.js +393 -2
- package/src/lib/agentic/contracts/abi/{v5 → v6}/agw.d.ts +96 -1
- package/src/lib/agentic/contracts/abi/{v5 → v6}/agw.js +128 -3
- package/src/lib/agentic/contracts/abi/{v5 → v6}/index.d.ts +1 -1
- package/src/lib/agentic/contracts/abi/{v5 → v6}/index.js +3 -3
- package/src/lib/agentic/contracts/abi/{v5 → v6}/smart-session.js +1 -1
- package/src/lib/agentic/contracts/abi/{v5 → v6}/universal-rules-policy.d.ts +329 -308
- package/src/lib/agentic/contracts/abi/{v5 → v6}/universal-rules-policy.js +396 -369
- package/src/lib/agentic/contracts/donut-v6.d.ts +11 -0
- package/src/lib/agentic/contracts/donut-v6.js +15 -0
- package/src/lib/agentic/contracts/{v5.d.ts → v6.d.ts} +800 -384
- package/src/lib/agentic/contracts/{v5.js → v6.js} +60 -33
- package/src/lib/agentic/deployments.d.ts +5 -5
- package/src/lib/agentic/deployments.js +19 -19
- package/src/lib/agentic/errors.d.ts +1 -7
- package/src/lib/agentic/errors.js +1 -9
- package/src/lib/agentic/execution/outbound.d.ts +4 -4
- package/src/lib/agentic/execution/outbound.js +5 -5
- package/src/lib/agentic/execution/send.js +3 -11
- package/src/lib/agentic/execution/svm-outbound.d.ts +1 -1
- package/src/lib/agentic/execution/svm-payload.js +1 -1
- package/src/lib/agentic/execution/svm-public.js +1 -7
- package/src/lib/agentic/execution/svm-send.d.ts +1 -1
- package/src/lib/agentic/execution/svm-send.js +0 -3
- package/src/lib/agentic/index.d.ts +1 -1
- package/src/lib/agentic/management/common.js +7 -5
- package/src/lib/agentic/management/create.d.ts +1 -13
- package/src/lib/agentic/management/create.js +24 -157
- package/src/lib/agentic/management/svm.js +2 -2
- package/src/lib/agentic/presets/catalog.d.ts +7 -2
- package/src/lib/agentic/presets/catalog.js +300 -3
- package/src/lib/agentic/presets/index.js +93 -18
- package/src/lib/agentic/presets/types.d.ts +5 -1
- package/src/lib/agentic/public-rule.d.ts +2 -2
- package/src/lib/agentic/public-rule.js +24 -40
- package/src/lib/agentic/reads/rules.js +27 -11
- package/src/lib/agentic/reads/svm.d.ts +1 -1
- package/src/lib/agentic/reads/svm.js +2 -2
- package/src/lib/agentic/response.js +7 -7
- package/src/lib/agentic/revert.js +5 -5
- package/src/lib/agentic/runtime.js +12 -3
- package/src/lib/agentic/utils.js +1 -1
- package/src/lib/constants/index.d.ts +1 -0
- package/src/lib/index.d.ts +1 -1
- package/src/lib/push-chain/push-chain.d.ts +1 -0
- package/src/lib/agentic/contracts/donut-v5.d.ts +0 -11
- package/src/lib/agentic/contracts/donut-v5.js +0 -15
- /package/src/lib/agentic/contracts/abi/{v5 → v6}/agent-validator.d.ts +0 -0
- /package/src/lib/agentic/contracts/abi/{v5 → v6}/smart-session.d.ts +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.v6 = exports.UEA_MULTICALL_PREFIX = exports.SEND_OUTBOUND_SELECTOR = exports.MODE_BATCH = exports.MODE_SINGLE = void 0;
|
|
4
4
|
const viem_1 = require("viem");
|
|
5
|
-
const
|
|
5
|
+
const v6_1 = require("./abi/v6");
|
|
6
6
|
exports.MODE_SINGLE = `0x${'00'.repeat(32)}`;
|
|
7
7
|
exports.MODE_BATCH = `0x01${'00'.repeat(31)}`;
|
|
8
8
|
exports.SEND_OUTBOUND_SELECTOR = '0x77b86bec';
|
|
@@ -22,36 +22,36 @@ const EXECUTION_TUPLE = [
|
|
|
22
22
|
],
|
|
23
23
|
},
|
|
24
24
|
];
|
|
25
|
-
exports.
|
|
26
|
-
id: '
|
|
25
|
+
exports.v6 = {
|
|
26
|
+
id: 'v6',
|
|
27
27
|
abis: {
|
|
28
|
-
wallet:
|
|
29
|
-
factory:
|
|
30
|
-
engine:
|
|
31
|
-
policy:
|
|
28
|
+
wallet: v6_1.AGW_ABI,
|
|
29
|
+
factory: v6_1.AGW_FACTORY_ABI,
|
|
30
|
+
engine: v6_1.SMART_SESSION_ABI,
|
|
31
|
+
policy: v6_1.UNIVERSAL_RULES_POLICY_ABI,
|
|
32
32
|
},
|
|
33
33
|
events: {
|
|
34
34
|
walletDeployed: (0, viem_1.getAbiItem)({
|
|
35
|
-
abi:
|
|
35
|
+
abi: v6_1.AGW_FACTORY_ABI,
|
|
36
36
|
name: 'WalletDeployed',
|
|
37
37
|
}),
|
|
38
38
|
checkpointed: (0, viem_1.getAbiItem)({
|
|
39
|
-
abi:
|
|
39
|
+
abi: v6_1.AGW_ABI,
|
|
40
40
|
name: 'Checkpointed',
|
|
41
41
|
}),
|
|
42
42
|
rulesGranted: (0, viem_1.getAbiItem)({
|
|
43
|
-
abi:
|
|
43
|
+
abi: v6_1.AGW_ABI,
|
|
44
44
|
name: 'RulesGranted',
|
|
45
45
|
}),
|
|
46
46
|
rulesRevoked: (0, viem_1.getAbiItem)({
|
|
47
|
-
abi:
|
|
47
|
+
abi: v6_1.AGW_ABI,
|
|
48
48
|
name: 'RulesRevoked',
|
|
49
49
|
}),
|
|
50
50
|
},
|
|
51
51
|
// ---------------------------------------------------------------- encoders
|
|
52
52
|
encodeDeployWallet(label) {
|
|
53
53
|
return (0, viem_1.encodeFunctionData)({
|
|
54
|
-
abi:
|
|
54
|
+
abi: v6_1.AGW_FACTORY_ABI,
|
|
55
55
|
functionName: 'deployWallet',
|
|
56
56
|
args: [label],
|
|
57
57
|
});
|
|
@@ -68,7 +68,7 @@ exports.v5 = {
|
|
|
68
68
|
const zero32 = `0x${'00'.repeat(32)}`;
|
|
69
69
|
const zeroAddress = '0x0000000000000000000000000000000000000000';
|
|
70
70
|
return (0, viem_1.encodeFunctionData)({
|
|
71
|
-
abi:
|
|
71
|
+
abi: v6_1.AGW_FACTORY_ABI,
|
|
72
72
|
functionName: 'deployWalletWithSig',
|
|
73
73
|
args: [
|
|
74
74
|
{
|
|
@@ -90,30 +90,57 @@ exports.v5 = {
|
|
|
90
90
|
],
|
|
91
91
|
});
|
|
92
92
|
},
|
|
93
|
+
encodeCreateWalletAt(owner, index, wallet, label, rules) {
|
|
94
|
+
const zero32 = `0x${'00'.repeat(32)}`;
|
|
95
|
+
const zeroAddress = '0x0000000000000000000000000000000000000000';
|
|
96
|
+
return (0, viem_1.encodeFunctionData)({
|
|
97
|
+
abi: v6_1.AGW_FACTORY_ABI,
|
|
98
|
+
functionName: 'createWalletWithSig',
|
|
99
|
+
args: [
|
|
100
|
+
{
|
|
101
|
+
owner,
|
|
102
|
+
wallet,
|
|
103
|
+
executor: zeroAddress,
|
|
104
|
+
index,
|
|
105
|
+
sessionHash: zero32,
|
|
106
|
+
mode: zero32,
|
|
107
|
+
execCalldataHash: zero32,
|
|
108
|
+
nonceKey: BigInt(0),
|
|
109
|
+
nonceSeq: BigInt(0),
|
|
110
|
+
grantNonce: BigInt(0),
|
|
111
|
+
deadline: 0,
|
|
112
|
+
signerChainId: BigInt(0),
|
|
113
|
+
},
|
|
114
|
+
'0x',
|
|
115
|
+
label,
|
|
116
|
+
rules,
|
|
117
|
+
],
|
|
118
|
+
});
|
|
119
|
+
},
|
|
93
120
|
encodeGrantRules(session) {
|
|
94
121
|
return (0, viem_1.encodeFunctionData)({
|
|
95
|
-
abi:
|
|
122
|
+
abi: v6_1.AGW_ABI,
|
|
96
123
|
functionName: 'grantRules',
|
|
97
124
|
args: [session],
|
|
98
125
|
});
|
|
99
126
|
},
|
|
100
127
|
encodeRevokeRules(rulesId) {
|
|
101
128
|
return (0, viem_1.encodeFunctionData)({
|
|
102
|
-
abi:
|
|
129
|
+
abi: v6_1.AGW_ABI,
|
|
103
130
|
functionName: 'revokeRules',
|
|
104
131
|
args: [rulesId],
|
|
105
132
|
});
|
|
106
133
|
},
|
|
107
134
|
encodeRevokeAllRules() {
|
|
108
135
|
return (0, viem_1.encodeFunctionData)({
|
|
109
|
-
abi:
|
|
136
|
+
abi: v6_1.AGW_ABI,
|
|
110
137
|
functionName: 'revokeAllRules',
|
|
111
138
|
args: [],
|
|
112
139
|
});
|
|
113
140
|
},
|
|
114
141
|
encodeSetLabel(label) {
|
|
115
142
|
return (0, viem_1.encodeFunctionData)({
|
|
116
|
-
abi:
|
|
143
|
+
abi: v6_1.AGW_ABI,
|
|
117
144
|
functionName: 'setLabel',
|
|
118
145
|
args: [label],
|
|
119
146
|
});
|
|
@@ -127,9 +154,9 @@ exports.v5 = {
|
|
|
127
154
|
throw new Error('execute needs at least one call');
|
|
128
155
|
if (calls.length === 1) {
|
|
129
156
|
return (0, viem_1.encodeFunctionData)({
|
|
130
|
-
abi:
|
|
157
|
+
abi: v6_1.AGW_ABI,
|
|
131
158
|
functionName: 'execute',
|
|
132
|
-
args: [exports.MODE_SINGLE, exports.
|
|
159
|
+
args: [exports.MODE_SINGLE, exports.v6.packSingle(calls[0])],
|
|
133
160
|
});
|
|
134
161
|
}
|
|
135
162
|
const batch = (0, viem_1.encodeAbiParameters)(EXECUTION_TUPLE, [
|
|
@@ -140,21 +167,21 @@ exports.v5 = {
|
|
|
140
167
|
})),
|
|
141
168
|
]);
|
|
142
169
|
return (0, viem_1.encodeFunctionData)({
|
|
143
|
-
abi:
|
|
170
|
+
abi: v6_1.AGW_ABI,
|
|
144
171
|
functionName: 'execute',
|
|
145
172
|
args: [exports.MODE_BATCH, batch],
|
|
146
173
|
});
|
|
147
174
|
},
|
|
148
175
|
encodeExecuteAsAgent(rulesId, call) {
|
|
149
176
|
return (0, viem_1.encodeFunctionData)({
|
|
150
|
-
abi:
|
|
177
|
+
abi: v6_1.AGW_ABI,
|
|
151
178
|
functionName: 'executeAsAgent',
|
|
152
|
-
args: [rulesId, exports.MODE_SINGLE, exports.
|
|
179
|
+
args: [rulesId, exports.MODE_SINGLE, exports.v6.packSingle(call)],
|
|
153
180
|
});
|
|
154
181
|
},
|
|
155
182
|
encodeAssertSpentNative(configId, wallet, expected) {
|
|
156
183
|
return (0, viem_1.encodeFunctionData)({
|
|
157
|
-
abi:
|
|
184
|
+
abi: v6_1.UNIVERSAL_RULES_POLICY_ABI,
|
|
158
185
|
functionName: 'assertSpent',
|
|
159
186
|
args: [
|
|
160
187
|
configId,
|
|
@@ -167,7 +194,7 @@ exports.v5 = {
|
|
|
167
194
|
},
|
|
168
195
|
encodeAssertSpentUniversal(configId, wallet, expectedSpent) {
|
|
169
196
|
return (0, viem_1.encodeFunctionData)({
|
|
170
|
-
abi:
|
|
197
|
+
abi: v6_1.UNIVERSAL_RULES_POLICY_ABI,
|
|
171
198
|
functionName: 'assertSpent',
|
|
172
199
|
args: [configId, wallet, expectedSpent],
|
|
173
200
|
});
|
|
@@ -176,7 +203,7 @@ exports.v5 = {
|
|
|
176
203
|
decodeWalletCall(data) {
|
|
177
204
|
let decoded;
|
|
178
205
|
try {
|
|
179
|
-
decoded = (0, viem_1.decodeFunctionData)({ abi:
|
|
206
|
+
decoded = (0, viem_1.decodeFunctionData)({ abi: v6_1.AGW_ABI, data });
|
|
180
207
|
}
|
|
181
208
|
catch {
|
|
182
209
|
return null;
|
|
@@ -215,7 +242,7 @@ exports.v5 = {
|
|
|
215
242
|
return k;
|
|
216
243
|
},
|
|
217
244
|
parseWalletDeployed(logs, factory) {
|
|
218
|
-
return decodeMatching(logs, factory, exports.
|
|
245
|
+
return decodeMatching(logs, factory, exports.v6.events.walletDeployed).map((args) => ({
|
|
219
246
|
owner: (0, viem_1.getAddress)(args['owner']),
|
|
220
247
|
index: BigInt(args['index']),
|
|
221
248
|
wallet: (0, viem_1.getAddress)(args['wallet']),
|
|
@@ -223,14 +250,14 @@ exports.v5 = {
|
|
|
223
250
|
}));
|
|
224
251
|
},
|
|
225
252
|
parseRulesGranted(logs, wallet) {
|
|
226
|
-
return decodeMatching(logs, wallet, exports.
|
|
253
|
+
return decodeMatching(logs, wallet, exports.v6.events.rulesGranted).map((args) => ({
|
|
227
254
|
rulesId: args['rulesId'],
|
|
228
255
|
mode: Number(args['mode']),
|
|
229
256
|
chainNamespace: args['chainNamespace'],
|
|
230
257
|
}));
|
|
231
258
|
},
|
|
232
259
|
parseRulesRevoked(logs, wallet) {
|
|
233
|
-
return decodeMatching(logs, wallet, exports.
|
|
260
|
+
return decodeMatching(logs, wallet, exports.v6.events.rulesRevoked).map((args) => ({
|
|
234
261
|
rulesId: args['rulesId'],
|
|
235
262
|
}));
|
|
236
263
|
},
|
|
@@ -238,11 +265,11 @@ exports.v5 = {
|
|
|
238
265
|
return logs
|
|
239
266
|
.filter((l) => sameAddress(l.address, wallet) &&
|
|
240
267
|
l.topics[0]?.toLowerCase() ===
|
|
241
|
-
(0, viem_1.toEventSelector)(exports.
|
|
268
|
+
(0, viem_1.toEventSelector)(exports.v6.events.checkpointed).toLowerCase())
|
|
242
269
|
.flatMap((log) => {
|
|
243
270
|
try {
|
|
244
271
|
const ev = (0, viem_1.decodeEventLog)({
|
|
245
|
-
abi: [exports.
|
|
272
|
+
abi: [exports.v6.events.checkpointed],
|
|
246
273
|
...log,
|
|
247
274
|
strict: true,
|
|
248
275
|
});
|
|
@@ -254,7 +281,7 @@ exports.v5 = {
|
|
|
254
281
|
})
|
|
255
282
|
.map(({ log, args }) => ({
|
|
256
283
|
seq: Number(args['seq']),
|
|
257
|
-
kind: exports.
|
|
284
|
+
kind: exports.v6.decodeCheckpointKind(Number(args['kind'])),
|
|
258
285
|
ref: args['ref'],
|
|
259
286
|
blockNumber: BigInt(log.blockNumber ?? BigInt(0)),
|
|
260
287
|
txHash: log.transactionHash,
|
|
@@ -313,4 +340,4 @@ function decodeMatching(logs, emitter, event) {
|
|
|
313
340
|
}
|
|
314
341
|
return out;
|
|
315
342
|
}
|
|
316
|
-
//# sourceMappingURL=
|
|
343
|
+
//# sourceMappingURL=v6.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Address } from 'viem';
|
|
2
2
|
import { PUSH_NETWORK } from '../constants/enums';
|
|
3
3
|
import { AgenticCapability } from './capabilities';
|
|
4
|
-
import { type AgwContracts } from './contracts/
|
|
4
|
+
import { type AgwContracts } from './contracts/v6';
|
|
5
5
|
import type { ChainReader } from './contracts/reader';
|
|
6
6
|
/**
|
|
7
7
|
* A verified AGW contract generation on one Push network. The registry is the
|
|
@@ -10,7 +10,7 @@ import type { ChainReader } from './contracts/reader';
|
|
|
10
10
|
* are NOT registered because they do not implement this ABI.
|
|
11
11
|
*/
|
|
12
12
|
export interface AgenticGeneration {
|
|
13
|
-
/** Stable identifier, e.g. '
|
|
13
|
+
/** Stable identifier, e.g. 'v6'. */
|
|
14
14
|
id: string;
|
|
15
15
|
/** Contract source commit the ABI was generated from. */
|
|
16
16
|
sourceCommit: string;
|
|
@@ -32,8 +32,8 @@ export interface AgenticGeneration {
|
|
|
32
32
|
capabilities: ReadonlySet<AgenticCapability>;
|
|
33
33
|
contracts: AgwContracts;
|
|
34
34
|
}
|
|
35
|
-
/** Capabilities the
|
|
36
|
-
export declare const
|
|
35
|
+
/** Capabilities the v6 ABI actually implements. Target-only features are absent. */
|
|
36
|
+
export declare const V6_CAPABILITIES: ReadonlySet<AgenticCapability>;
|
|
37
37
|
/**
|
|
38
38
|
* @internal Register a generation that is NOT a verified release deployment —
|
|
39
39
|
* the local contract harness and E2E manifest loader use this. Not exported
|
|
@@ -42,7 +42,7 @@ export declare const V5_CAPABILITIES: ReadonlySet<AgenticCapability>;
|
|
|
42
42
|
export declare function registerAgenticGeneration(input: Omit<AgenticGeneration, 'contracts' | 'capabilities'> & {
|
|
43
43
|
capabilities?: ReadonlySet<AgenticCapability>;
|
|
44
44
|
}): AgenticGeneration;
|
|
45
|
-
/** @internal Test/harness cleanup. Restores the checked Donut
|
|
45
|
+
/** @internal Test/harness cleanup. Restores the checked Donut v6 registry. */
|
|
46
46
|
export declare function resetAgenticGenerations(): void;
|
|
47
47
|
/** Grant compatibility check; the unrestricted owner door does not consult URP. */
|
|
48
48
|
export declare function verifyPolicyVersion(reader: ChainReader, gen: AgenticGeneration): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.V6_CAPABILITIES = void 0;
|
|
4
4
|
exports.registerAgenticGeneration = registerAgenticGeneration;
|
|
5
5
|
exports.resetAgenticGenerations = resetAgenticGenerations;
|
|
6
6
|
exports.verifyPolicyVersion = verifyPolicyVersion;
|
|
@@ -12,11 +12,11 @@ exports.resolveWalletGeneration = resolveWalletGeneration;
|
|
|
12
12
|
const viem_1 = require("viem");
|
|
13
13
|
const enums_1 = require("../constants/enums");
|
|
14
14
|
const capabilities_1 = require("./capabilities");
|
|
15
|
-
const
|
|
15
|
+
const v6_1 = require("./contracts/v6");
|
|
16
16
|
const errors_1 = require("./errors");
|
|
17
|
-
const
|
|
18
|
-
/** Capabilities the
|
|
19
|
-
exports.
|
|
17
|
+
const donut_v6_1 = require("./contracts/donut-v6");
|
|
18
|
+
/** Capabilities the v6 ABI actually implements. Target-only features are absent. */
|
|
19
|
+
exports.V6_CAPABILITIES = new Set([
|
|
20
20
|
capabilities_1.AgenticCapability.WALLET_READS,
|
|
21
21
|
capabilities_1.AgenticCapability.ACTIVE_RULE_READS,
|
|
22
22
|
capabilities_1.AgenticCapability.OWNER_EXECUTE,
|
|
@@ -31,19 +31,19 @@ exports.V5_CAPABILITIES = new Set([
|
|
|
31
31
|
capabilities_1.AgenticCapability.SET_LABEL,
|
|
32
32
|
]);
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* V6 only. Unsupported networks fail before signing; no legacy adapter fallback.
|
|
35
35
|
*/
|
|
36
36
|
const VERIFIED_DEPLOYMENTS = [
|
|
37
37
|
{
|
|
38
|
-
id: '
|
|
39
|
-
sourceCommit:
|
|
38
|
+
id: 'v6',
|
|
39
|
+
sourceCommit: donut_v6_1.V6_SOURCE_COMMIT,
|
|
40
40
|
network: enums_1.PUSH_NETWORK.TESTNET_DONUT,
|
|
41
41
|
advertised: true,
|
|
42
|
-
addresses:
|
|
43
|
-
startBlock:
|
|
42
|
+
addresses: donut_v6_1.DONUT_V6_ADDRESSES,
|
|
43
|
+
startBlock: donut_v6_1.DONUT_V6_START_BLOCK,
|
|
44
44
|
accountId: 'push.agw.1.0.0',
|
|
45
|
-
capabilities: exports.
|
|
46
|
-
contracts:
|
|
45
|
+
capabilities: exports.V6_CAPABILITIES,
|
|
46
|
+
contracts: v6_1.v6,
|
|
47
47
|
},
|
|
48
48
|
];
|
|
49
49
|
const registry = [...VERIFIED_DEPLOYMENTS];
|
|
@@ -53,7 +53,7 @@ const registry = [...VERIFIED_DEPLOYMENTS];
|
|
|
53
53
|
* from the package entry point.
|
|
54
54
|
*/
|
|
55
55
|
function registerAgenticGeneration(input) {
|
|
56
|
-
if (input.id !==
|
|
56
|
+
if (input.id !== v6_1.v6.id || input.sourceCommit !== donut_v6_1.V6_SOURCE_COMMIT) {
|
|
57
57
|
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.CAPABILITY_UNAVAILABLE, `no contract adapter for generation "${input.id}"`);
|
|
58
58
|
}
|
|
59
59
|
const gen = {
|
|
@@ -66,8 +66,8 @@ function registerAgenticGeneration(input) {
|
|
|
66
66
|
sessionValidator: (0, viem_1.getAddress)(input.addresses.sessionValidator),
|
|
67
67
|
gateway: (0, viem_1.getAddress)(input.addresses.gateway),
|
|
68
68
|
},
|
|
69
|
-
capabilities: input.capabilities ?? exports.
|
|
70
|
-
contracts:
|
|
69
|
+
capabilities: input.capabilities ?? exports.V6_CAPABILITIES,
|
|
70
|
+
contracts: v6_1.v6,
|
|
71
71
|
};
|
|
72
72
|
const existing = registry.findIndex((g) => g.network === gen.network && g.addresses.factory === gen.addresses.factory);
|
|
73
73
|
if (existing >= 0)
|
|
@@ -76,7 +76,7 @@ function registerAgenticGeneration(input) {
|
|
|
76
76
|
verifiedWiring.clear();
|
|
77
77
|
return gen;
|
|
78
78
|
}
|
|
79
|
-
/** @internal Test/harness cleanup. Restores the checked Donut
|
|
79
|
+
/** @internal Test/harness cleanup. Restores the checked Donut v6 registry. */
|
|
80
80
|
function resetAgenticGenerations() {
|
|
81
81
|
registry.splice(0, registry.length, ...VERIFIED_DEPLOYMENTS);
|
|
82
82
|
verifiedWiring.clear();
|
|
@@ -89,7 +89,7 @@ async function verifyPolicyVersion(reader, gen) {
|
|
|
89
89
|
functionName: 'version',
|
|
90
90
|
});
|
|
91
91
|
if (version !== '3.1.0')
|
|
92
|
-
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.CAPABILITY_UNAVAILABLE, `URP version ${String(version)} is not supported by the
|
|
92
|
+
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.CAPABILITY_UNAVAILABLE, `URP version ${String(version)} is not supported by the v6 adapter`);
|
|
93
93
|
}
|
|
94
94
|
function generationsFor(network) {
|
|
95
95
|
return registry.filter((g) => g.network === network);
|
|
@@ -100,7 +100,7 @@ function currentGeneration(network) {
|
|
|
100
100
|
const gen = gens[gens.length - 1];
|
|
101
101
|
if (!gen) {
|
|
102
102
|
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.CAPABILITY_UNAVAILABLE, `no verified AGW deployment is registered for ${network}`, {
|
|
103
|
-
hint: 'AGW
|
|
103
|
+
hint: 'AGW v6 is configured on Donut only; this Push network has no registered v6 deployment.',
|
|
104
104
|
details: { network, assumption: 'A07' },
|
|
105
105
|
});
|
|
106
106
|
}
|
|
@@ -158,7 +158,7 @@ async function resolveWalletGeneration(reader, network, wallet) {
|
|
|
158
158
|
try {
|
|
159
159
|
factory = (0, viem_1.getAddress)((await reader.readContract({
|
|
160
160
|
address: wallet,
|
|
161
|
-
abi:
|
|
161
|
+
abi: v6_1.v6.abis.wallet,
|
|
162
162
|
functionName: 'factory',
|
|
163
163
|
})));
|
|
164
164
|
}
|
|
@@ -25,18 +25,16 @@ export declare const AGENTIC_ERROR_CODE: {
|
|
|
25
25
|
readonly RULE_READ_FAILED: "RULE_READ_FAILED";
|
|
26
26
|
readonly INCONSISTENT_READ: "INCONSISTENT_READ";
|
|
27
27
|
readonly INDEX_RACE: "INDEX_RACE";
|
|
28
|
-
readonly CREATE_PARTIAL: "CREATE_PARTIAL";
|
|
29
28
|
readonly RECEIPT_MISMATCH: "RECEIPT_MISMATCH";
|
|
30
29
|
readonly RECEIPT_UNAVAILABLE: "RECEIPT_UNAVAILABLE";
|
|
31
30
|
readonly AGENT_GAS_INSUFFICIENT: "AGENT_GAS_INSUFFICIENT";
|
|
32
31
|
readonly WALLET_BALANCE_INSUFFICIENT: "WALLET_BALANCE_INSUFFICIENT";
|
|
33
|
-
readonly GATEWAY_ALLOWANCE_INSUFFICIENT: "GATEWAY_ALLOWANCE_INSUFFICIENT";
|
|
34
32
|
};
|
|
35
33
|
export type AgenticErrorCode = (typeof AGENTIC_ERROR_CODE)[keyof typeof AGENTIC_ERROR_CODE];
|
|
36
34
|
/**
|
|
37
35
|
* Pre-signature AGW failure: invalid input, unsupported capability, failed
|
|
38
36
|
* eligibility or a read that cannot be trusted. Nothing was signed or sent
|
|
39
|
-
*
|
|
37
|
+
* except receipt errors, which retain the submitted transaction hash.
|
|
40
38
|
*/
|
|
41
39
|
export declare class AgenticError extends Error {
|
|
42
40
|
readonly code: AgenticErrorCode;
|
|
@@ -57,14 +55,10 @@ export declare class AgenticError extends Error {
|
|
|
57
55
|
*/
|
|
58
56
|
export declare class AgenticRevertError extends PushChainExecutionError {
|
|
59
57
|
readonly agenticCode?: string;
|
|
60
|
-
readonly transactionHashes?: `0x${string}`[];
|
|
61
|
-
readonly pendingTransactionHash?: `0x${string}`;
|
|
62
58
|
constructor(message: string, opts?: {
|
|
63
59
|
decodedError?: DecodedErrorPayload;
|
|
64
60
|
gatewayTxHash?: string;
|
|
65
61
|
agenticCode?: string;
|
|
66
|
-
transactionHashes?: `0x${string}`[];
|
|
67
|
-
pendingTransactionHash?: `0x${string}`;
|
|
68
62
|
cause?: unknown;
|
|
69
63
|
});
|
|
70
64
|
}
|
|
@@ -34,17 +34,15 @@ exports.AGENTIC_ERROR_CODE = {
|
|
|
34
34
|
RULE_READ_FAILED: 'RULE_READ_FAILED',
|
|
35
35
|
INCONSISTENT_READ: 'INCONSISTENT_READ',
|
|
36
36
|
INDEX_RACE: 'INDEX_RACE',
|
|
37
|
-
CREATE_PARTIAL: 'CREATE_PARTIAL',
|
|
38
37
|
RECEIPT_MISMATCH: 'RECEIPT_MISMATCH',
|
|
39
38
|
RECEIPT_UNAVAILABLE: 'RECEIPT_UNAVAILABLE',
|
|
40
39
|
AGENT_GAS_INSUFFICIENT: 'AGENT_GAS_INSUFFICIENT',
|
|
41
40
|
WALLET_BALANCE_INSUFFICIENT: 'WALLET_BALANCE_INSUFFICIENT',
|
|
42
|
-
GATEWAY_ALLOWANCE_INSUFFICIENT: 'GATEWAY_ALLOWANCE_INSUFFICIENT',
|
|
43
41
|
};
|
|
44
42
|
/**
|
|
45
43
|
* Pre-signature AGW failure: invalid input, unsupported capability, failed
|
|
46
44
|
* eligibility or a read that cannot be trusted. Nothing was signed or sent
|
|
47
|
-
*
|
|
45
|
+
* except receipt errors, which retain the submitted transaction hash.
|
|
48
46
|
*/
|
|
49
47
|
class AgenticError extends Error {
|
|
50
48
|
code;
|
|
@@ -69,8 +67,6 @@ exports.AgenticError = AgenticError;
|
|
|
69
67
|
*/
|
|
70
68
|
class AgenticRevertError extends errors_1.PushChainExecutionError {
|
|
71
69
|
agenticCode;
|
|
72
|
-
transactionHashes;
|
|
73
|
-
pendingTransactionHash;
|
|
74
70
|
constructor(message, opts = {}) {
|
|
75
71
|
super(message, {
|
|
76
72
|
decodedError: opts.decodedError,
|
|
@@ -79,10 +75,6 @@ class AgenticRevertError extends errors_1.PushChainExecutionError {
|
|
|
79
75
|
});
|
|
80
76
|
this.name = 'AgenticRevertError';
|
|
81
77
|
this.agenticCode = opts.agenticCode;
|
|
82
|
-
this.transactionHashes = opts.transactionHashes
|
|
83
|
-
? [...opts.transactionHashes]
|
|
84
|
-
: undefined;
|
|
85
|
-
this.pendingTransactionHash = opts.pendingTransactionHash;
|
|
86
78
|
}
|
|
87
79
|
}
|
|
88
80
|
exports.AgenticRevertError = AgenticRevertError;
|
|
@@ -3,9 +3,9 @@ import { CHAIN } from '../../constants/enums';
|
|
|
3
3
|
import type { MoveableToken } from '../../constants/tokens';
|
|
4
4
|
import type { UniversalExecuteParams, UniversalOutboundTxRequest } from '../../orchestrator/orchestrator.types';
|
|
5
5
|
import type { AgenticGeneration } from '../deployments';
|
|
6
|
-
import type { Call } from '../contracts/
|
|
6
|
+
import type { Call } from '../contracts/v6';
|
|
7
7
|
import type { AgenticRuntime } from '../runtime';
|
|
8
|
-
/** URP MAX_ACTIONS_PER_REQUEST at
|
|
8
|
+
/** URP MAX_ACTIONS_PER_REQUEST at v6. */
|
|
9
9
|
export declare const MAX_DESTINATION_CALLS = 10;
|
|
10
10
|
export interface DestinationCall {
|
|
11
11
|
to: Address;
|
|
@@ -46,8 +46,8 @@ export declare function destinationCalls(params: UniversalExecuteParams, ctx: {
|
|
|
46
46
|
* - payload = UEA_MULTICALL ‖ abi.encode(Multicall[1..10]) executed by the AGW's CEA
|
|
47
47
|
* - value = protocolFee + maxPCForGas, paid from the AGW's PC
|
|
48
48
|
* The destination account is resolved from the AGW, never from the signer.
|
|
49
|
-
* The SDK
|
|
50
|
-
*
|
|
49
|
+
* The SDK does not add approval calls: the v6 wallet approves and clears
|
|
50
|
+
* the gateway allowance within its own outbound execution.
|
|
51
51
|
*/
|
|
52
52
|
export declare function composeOutbound(runtime: AgenticRuntime, gen: AgenticGeneration, wallet: Address, params: UniversalExecuteParams, opts: {
|
|
53
53
|
ruleAssets?: readonly Address[];
|
|
@@ -10,11 +10,11 @@ const abi_1 = require("../../constants/abi");
|
|
|
10
10
|
const orchestrator_types_1 = require("../../orchestrator/orchestrator.types");
|
|
11
11
|
const route_handlers_1 = require("../../orchestrator/internals/route-handlers");
|
|
12
12
|
const capabilities_1 = require("../capabilities");
|
|
13
|
-
const
|
|
13
|
+
const v6_1 = require("../contracts/v6");
|
|
14
14
|
const errors_1 = require("../errors");
|
|
15
15
|
/** Includes first-use CEA deployment; explicit caller gas always takes precedence. */
|
|
16
16
|
const FIRST_USE_EVM_GAS_LIMIT = BigInt(2_000_000);
|
|
17
|
-
/** URP MAX_ACTIONS_PER_REQUEST at
|
|
17
|
+
/** URP MAX_ACTIONS_PER_REQUEST at v6. */
|
|
18
18
|
exports.MAX_DESTINATION_CALLS = 10;
|
|
19
19
|
const MULTICALL_TUPLE = [
|
|
20
20
|
{
|
|
@@ -81,8 +81,8 @@ function destinationCalls(params, ctx) {
|
|
|
81
81
|
* - payload = UEA_MULTICALL ‖ abi.encode(Multicall[1..10]) executed by the AGW's CEA
|
|
82
82
|
* - value = protocolFee + maxPCForGas, paid from the AGW's PC
|
|
83
83
|
* The destination account is resolved from the AGW, never from the signer.
|
|
84
|
-
* The SDK
|
|
85
|
-
*
|
|
84
|
+
* The SDK does not add approval calls: the v6 wallet approves and clears
|
|
85
|
+
* the gateway allowance within its own outbound execution.
|
|
86
86
|
*/
|
|
87
87
|
async function composeOutbound(runtime, gen, wallet, params, opts) {
|
|
88
88
|
(0, capabilities_1.requireCapability)(gen.capabilities, capabilities_1.AgenticCapability.UNIVERSAL_EVM_OUTBOUND);
|
|
@@ -154,7 +154,7 @@ async function composeOutbound(runtime, gen, wallet, params, opts) {
|
|
|
154
154
|
const maxPCForGas = quote.nativeValueForGas;
|
|
155
155
|
const value = quote.protocolFee + maxPCForGas;
|
|
156
156
|
const payload = (0, viem_1.concat)([
|
|
157
|
-
|
|
157
|
+
v6_1.UEA_MULTICALL_PREFIX,
|
|
158
158
|
(0, viem_1.encodeAbiParameters)(MULTICALL_TUPLE, [calls]),
|
|
159
159
|
]);
|
|
160
160
|
const request = {
|
|
@@ -8,7 +8,7 @@ const progress_hook_types_1 = require("../../progress-hook/progress-hook.types")
|
|
|
8
8
|
const route_detector_1 = require("../../orchestrator/route-detector");
|
|
9
9
|
const helpers_1 = require("../../orchestrator/internals/helpers");
|
|
10
10
|
const capabilities_1 = require("../capabilities");
|
|
11
|
-
const
|
|
11
|
+
const v6_1 = require("../contracts/v6");
|
|
12
12
|
const ids_1 = require("../codec/ids");
|
|
13
13
|
const errors_1 = require("../errors");
|
|
14
14
|
const common_1 = require("../management/common");
|
|
@@ -173,7 +173,7 @@ async function agenticSend(runtime, actx, params, options) {
|
|
|
173
173
|
}
|
|
174
174
|
rulesId = rule.rulesId;
|
|
175
175
|
const cfg = await snap.read(gen.addresses.rulesPolicy, gen.contracts.abis.policy, 'getConfig', [
|
|
176
|
-
(0, ids_1.configId)(wallet, rule.rulesId, (0, ids_1.actionId)(gen.addresses.gateway,
|
|
176
|
+
(0, ids_1.configId)(wallet, rule.rulesId, (0, ids_1.actionId)(gen.addresses.gateway, v6_1.SEND_OUTBOUND_SELECTOR)),
|
|
177
177
|
wallet,
|
|
178
178
|
]);
|
|
179
179
|
ruleAssets = cfg.assets.map((a) => (0, viem_1.getAddress)(a.token));
|
|
@@ -185,7 +185,7 @@ async function agenticSend(runtime, actx, params, options) {
|
|
|
185
185
|
});
|
|
186
186
|
outboundChain = out.chain;
|
|
187
187
|
meta = { route: 'UOA_TO_CEA', destinationAccount: out.destinationAccount };
|
|
188
|
-
const [walletPc, tokenBalance
|
|
188
|
+
const [walletPc, tokenBalance] = await Promise.all([
|
|
189
189
|
runtime.reader.getBalance({
|
|
190
190
|
address: wallet,
|
|
191
191
|
blockNumber: snap.blockNumber,
|
|
@@ -193,7 +193,6 @@ async function agenticSend(runtime, actx, params, options) {
|
|
|
193
193
|
out.amount > BigInt(0)
|
|
194
194
|
? snap.read(out.token, abi_1.ERC20_EVM, 'balanceOf', [wallet])
|
|
195
195
|
: Promise.resolve(BigInt(0)),
|
|
196
|
-
snap.read(out.token, abi_1.ERC20_EVM, 'allowance', [wallet, gen.addresses.gateway]),
|
|
197
196
|
]);
|
|
198
197
|
if (walletPc < out.value) {
|
|
199
198
|
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.WALLET_BALANCE_INSUFFICIENT, `wallet ${wallet} holds ${walletPc} PC wei; this outbound needs ${out.value} (protocol fee + gas cap)`, { hint: "Fund the wallet's PC with an ordinary send to its address." });
|
|
@@ -201,13 +200,6 @@ async function agenticSend(runtime, actx, params, options) {
|
|
|
201
200
|
if (tokenBalance < out.amount) {
|
|
202
201
|
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.WALLET_BALANCE_INSUFFICIENT, `wallet ${wallet} holds ${tokenBalance} of ${out.token}; this outbound burns ${out.amount}`);
|
|
203
202
|
}
|
|
204
|
-
// Both doors only consume an allowance the owner set separately; the SDK
|
|
205
|
-
// never writes one (a write from a stale read could restore revoked authority).
|
|
206
|
-
if (out.amount > allowance) {
|
|
207
|
-
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.GATEWAY_ALLOWANCE_INSUFFICIENT, `the gateway may pull ${allowance} of ${out.token} from the wallet; this outbound needs ${out.amount}`, {
|
|
208
|
-
hint: 'Set a bounded allowance first with an owner-door send: approve(gateway, cap) on the token (approve(gateway, 0) removes it).',
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
203
|
if (actx.door === 'agent') {
|
|
212
204
|
if (expectedCEA && expectedCEA !== out.destinationAccount) {
|
|
213
205
|
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INCONSISTENT_READ, `rule ${rulesId} committed destination account ${expectedCEA}, but the wallet's account on ${out.chain} now derives to ${out.destinationAccount}`, {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Outbound encoding plus a diagnostic-only policy preview. */
|
|
2
2
|
import { type Address, type Hex } from 'viem';
|
|
3
|
-
import type { Call, SvmConfigRead } from '../contracts/
|
|
3
|
+
import type { Call, SvmConfigRead } from '../contracts/v6';
|
|
4
4
|
export interface SvmOutboundInput {
|
|
5
5
|
wallet: Address;
|
|
6
6
|
gateway: Address;
|
|
@@ -90,7 +90,7 @@ function validateAgwSvmPayload(terms, recipient, payload) {
|
|
|
90
90
|
if (rule < 0)
|
|
91
91
|
fail('ProgramNotAllowed');
|
|
92
92
|
const fixed = terms.programs[rule].maxAccounts;
|
|
93
|
-
if (fixed && fixed !== v.accounts.length)
|
|
93
|
+
if (fixed !== 255 && fixed !== v.accounts.length)
|
|
94
94
|
fail('SvmAccountCountMismatch');
|
|
95
95
|
const pins = terms.pins.filter((p) => p.ruleIndex === rule);
|
|
96
96
|
for (const p of pins) {
|
|
@@ -94,22 +94,16 @@ async function sendPublicSvm(runtime, actx, p, options) {
|
|
|
94
94
|
destinationTransfer = { recipient: target, token, amount };
|
|
95
95
|
transferValue = quote.isNative ? amount : BigInt(0);
|
|
96
96
|
}
|
|
97
|
-
const [pc, balance
|
|
97
|
+
const [pc, balance] = await Promise.all([
|
|
98
98
|
runtime.reader.getBalance({
|
|
99
99
|
address: wallet,
|
|
100
100
|
blockNumber: snap.blockNumber,
|
|
101
101
|
}),
|
|
102
102
|
snap.read(token, viem_1.erc20Abi, 'balanceOf', [wallet]),
|
|
103
|
-
snap.read(token, viem_1.erc20Abi, 'allowance', [
|
|
104
|
-
wallet,
|
|
105
|
-
gen.addresses.gateway,
|
|
106
|
-
]),
|
|
107
103
|
]);
|
|
108
104
|
const value = quote.protocolFee + quote.nativeValueForGas;
|
|
109
105
|
if (pc < value || balance < amount)
|
|
110
106
|
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.WALLET_BALANCE_INSUFFICIENT, 'wallet cannot cover Solana outbound');
|
|
111
|
-
if (allowance < amount)
|
|
112
|
-
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.GATEWAY_ALLOWANCE_INSUFFICIENT, 'set the wallet gateway allowance separately');
|
|
113
107
|
const call = (0, svm_outbound_1.buildAgwSvmAction)({
|
|
114
108
|
wallet,
|
|
115
109
|
gateway: gen.addresses.gateway,
|
|
@@ -17,7 +17,7 @@ export interface PreparedSvmRequest {
|
|
|
17
17
|
}
|
|
18
18
|
export declare function prepareSvmAgentExecution(runtime: AgenticRuntime, gen: AgenticGeneration, input: PreparedSvmRequest, metadata: SvmMetadataProvider): Promise<{
|
|
19
19
|
stored: import("../reads/svm").SvmRuleSnapshot;
|
|
20
|
-
call: import("../contracts/
|
|
20
|
+
call: import("../contracts/v6").Call;
|
|
21
21
|
instruction: {
|
|
22
22
|
recipient: `0x${string}`;
|
|
23
23
|
payload: `0x${string}`;
|
|
@@ -55,9 +55,6 @@ async function prepareSvmAgentExecution(runtime, gen, input, metadata) {
|
|
|
55
55
|
const balance = await snap.read(input.token, viem_1.erc20Abi, 'balanceOf', [input.wallet]);
|
|
56
56
|
if (balance < input.amount)
|
|
57
57
|
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.WALLET_BALANCE_INSUFFICIENT, 'wallet token balance is below the SVM amount');
|
|
58
|
-
const allowance = await snap.read(input.token, viem_1.erc20Abi, 'allowance', [input.wallet, gen.addresses.gateway]);
|
|
59
|
-
if (allowance < input.amount)
|
|
60
|
-
throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.GATEWAY_ALLOWANCE_INSUFFICIENT, 'owner must establish the SVM gateway allowance separately');
|
|
61
58
|
}
|
|
62
59
|
const signerPc = await runtime.signerBalance();
|
|
63
60
|
const gasReserve = (await runtime.getGasPrice()) * BigInt(10_000_000);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { AgenticAddress, AgenticHex, AgenticDoor, AgenticNamespace, AgenticProgressHook, AgenticTxMetadata, AgenticWallet, RuleCall as AllowedCall, RuleAsset as AssetCap, Checkpoint, CheckpointKind, CreateOptions, CreateResult, ForeignChainNamespace, DecodedSolanaRule, Rule, RuleInput, Pin, Spent, WalletMarker, RulesRecord, Selector, WalletInfo, WalletSummary, } from './agentic.types';
|
|
1
|
+
export type { AgenticAddress, AgenticHex, AgenticDoor, AgenticNamespace, AgenticProgressHook, AgenticTxMetadata, AgenticWallet, RuleCall as AllowedCall, RuleAsset as AssetCap, Checkpoint, CheckpointKind, CreateOptions, CreateResult, ForeignChainNamespace, DecodedSolanaRule, Rule, RuleInput, Pin, Spent, WalletMarker, ArgumentPath, RulesRecord, Selector, WalletInfo, WalletSummary, } from './agentic.types';
|
|
2
2
|
export { AGENTIC_ERROR_CODE, AgenticError, AgenticRevertError } from './errors';
|
|
3
3
|
export type { AgenticErrorCode } from './errors';
|
|
4
4
|
export { AGENTIC } from './constants';
|