@elizaos/cli 1.5.12-alpha.1 → 1.5.12
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/dist/characters/eliza.d.ts.map +1 -1
- package/dist/commands/agent/utils/validation.d.ts +31 -3
- package/dist/commands/agent/utils/validation.d.ts.map +1 -1
- package/dist/commands/create/actions/setup.d.ts.map +1 -1
- package/dist/commands/create/types.d.ts +8 -7
- package/dist/commands/create/types.d.ts.map +1 -1
- package/dist/commands/create/utils/validation.d.ts +2 -2
- package/dist/commands/create/utils/validation.d.ts.map +1 -1
- package/dist/commands/dev/actions/dev-server.d.ts.map +1 -1
- package/dist/commands/report/src/report-schema.d.ts +167 -11
- package/dist/commands/report/src/report-schema.d.ts.map +1 -1
- package/dist/commands/scenario/src/MockEngine.d.ts +11 -11
- package/dist/commands/scenario/src/matrix-schema.d.ts +70 -5
- package/dist/commands/scenario/src/matrix-schema.d.ts.map +1 -1
- package/dist/commands/scenario/src/plugin-parser.d.ts +31 -6
- package/dist/commands/scenario/src/plugin-parser.d.ts.map +1 -1
- package/dist/commands/scenario/src/runtime-factory.d.ts.map +1 -1
- package/dist/commands/scenario/src/schema.d.ts +2007 -175
- package/dist/commands/scenario/src/schema.d.ts.map +1 -1
- package/dist/commands/start/actions/agent-start.d.ts +14 -0
- package/dist/commands/start/actions/agent-start.d.ts.map +1 -0
- package/dist/commands/start/actions/server-start.d.ts +17 -0
- package/dist/commands/start/actions/server-start.d.ts.map +1 -0
- package/dist/commands/start/index.d.ts +5 -0
- package/dist/commands/start/index.d.ts.map +1 -1
- package/dist/commands/start/utils/config-utils.d.ts +30 -0
- package/dist/commands/start/utils/config-utils.d.ts.map +1 -0
- package/dist/commands/start/utils/dependency-resolver.d.ts +8 -0
- package/dist/commands/start/utils/dependency-resolver.d.ts.map +1 -0
- package/dist/commands/start/utils/loader.d.ts +68 -0
- package/dist/commands/start/utils/loader.d.ts.map +1 -0
- package/dist/commands/start/utils/plugin-utils.d.ts +17 -0
- package/dist/commands/start/utils/plugin-utils.d.ts.map +1 -0
- package/dist/commands/test/actions/e2e-tests.d.ts.map +1 -1
- package/dist/index.js +16784 -25156
- package/dist/index.js.map +29 -91
- package/dist/templates/plugin-quick-starter/package.json +4 -4
- package/dist/templates/plugin-starter/package.json +4 -4
- package/dist/templates/project-starter/package.json +7 -7
- package/dist/templates/project-tee-starter/package.json +5 -5
- package/dist/templates/project-tee-starter/src/__tests__/config.test.ts +1 -1
- package/dist/templates/project-tee-starter/src/__tests__/tee-validation.test.ts +4 -60
- package/dist/templates/project-tee-starter/src/plugin.ts +25 -66
- package/dist/utils/get-config.d.ts +194 -27
- package/dist/utils/get-config.d.ts.map +1 -1
- package/dist/utils/local-cli-delegation.d.ts.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/package.json +8 -9
- package/templates/plugin-quick-starter/package.json +4 -4
- package/templates/plugin-starter/package.json +4 -4
- package/templates/project-starter/package.json +7 -7
- package/templates/project-tee-starter/package.json +5 -5
- package/templates/project-tee-starter/src/__tests__/config.test.ts +1 -1
- package/templates/project-tee-starter/src/__tests__/tee-validation.test.ts +4 -60
- package/templates/project-tee-starter/src/plugin.ts +25 -66
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/cli",
|
|
3
|
-
"version": "1.5.12
|
|
3
|
+
"version": "1.5.12",
|
|
4
4
|
"description": "elizaOS CLI - Manage your AI agents and plugins",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -74,17 +74,16 @@
|
|
|
74
74
|
"typescript": "5.8.3",
|
|
75
75
|
"vite": "^6.3.5"
|
|
76
76
|
},
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "e1372a010e0bd6c9456c6826e7f9996ddad806db",
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@anthropic-ai/claude-code": "^1.0.35",
|
|
80
80
|
"@anthropic-ai/sdk": "^0.54.0",
|
|
81
81
|
"@clack/prompts": "^0.11.0",
|
|
82
|
-
"@elizaos/api-client": "1.5.12
|
|
83
|
-
"@elizaos/core": "1.5.12
|
|
84
|
-
"@elizaos/plugin-bootstrap": "1.5.12
|
|
85
|
-
"@elizaos/plugin-
|
|
86
|
-
"@elizaos/
|
|
87
|
-
"@elizaos/server": "1.5.12-alpha.1",
|
|
82
|
+
"@elizaos/api-client": "1.5.12",
|
|
83
|
+
"@elizaos/core": "1.5.12",
|
|
84
|
+
"@elizaos/plugin-bootstrap": "1.5.12",
|
|
85
|
+
"@elizaos/plugin-sql": "1.5.12",
|
|
86
|
+
"@elizaos/server": "1.5.12",
|
|
88
87
|
"bun": "^1.2.21",
|
|
89
88
|
"chalk": "^5.4.1",
|
|
90
89
|
"chokidar": "^4.0.3",
|
|
@@ -102,6 +101,6 @@
|
|
|
102
101
|
"tsconfig-paths": "^4.2.0",
|
|
103
102
|
"type-fest": "^4.41.0",
|
|
104
103
|
"yoctocolors": "^2.1.1",
|
|
105
|
-
"zod": "
|
|
104
|
+
"zod": "3.24.2"
|
|
106
105
|
}
|
|
107
106
|
}
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
"package.json"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@elizaos/core": "1.5.12
|
|
43
|
-
"zod": "
|
|
42
|
+
"@elizaos/core": "1.5.12",
|
|
43
|
+
"zod": "^3.24.4"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@elizaos/cli": "1.5.12
|
|
46
|
+
"@elizaos/cli": "1.5.12",
|
|
47
47
|
"dotenv": "16.4.5",
|
|
48
48
|
"prettier": "3.5.3",
|
|
49
49
|
"typescript": "5.8.2"
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
},
|
|
63
63
|
"resolutions": {
|
|
64
64
|
"// Note": "langchain 0.3.30 fixes @langchain/core zod/v3 import issues",
|
|
65
|
-
"zod": "
|
|
65
|
+
"zod": "^3.24.4",
|
|
66
66
|
"langchain": "0.3.30",
|
|
67
67
|
"@langchain/core": "0.3.30"
|
|
68
68
|
},
|
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
"package.json"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@elizaos/core": "1.5.12
|
|
42
|
+
"@elizaos/core": "1.5.12",
|
|
43
43
|
"@tanstack/react-query": "^5.80.7",
|
|
44
44
|
"clsx": "^2.1.1",
|
|
45
45
|
"tailwind-merge": "^3.3.1",
|
|
46
46
|
"tailwindcss": "^4.1.10",
|
|
47
47
|
"vite": "^6.3.5",
|
|
48
|
-
"zod": "
|
|
48
|
+
"zod": "3.24.2"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@elizaos/cli": "1.5.12
|
|
51
|
+
"@elizaos/cli": "1.5.12",
|
|
52
52
|
"@tailwindcss/vite": "^4.1.10",
|
|
53
53
|
"@vitejs/plugin-react-swc": "^3.10.2",
|
|
54
54
|
"dotenv": "16.4.5",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"resolutions": {
|
|
79
79
|
"// Note": "langchain 0.3.30 fixes @langchain/core zod/v3 import issues",
|
|
80
|
-
"zod": "
|
|
80
|
+
"zod": "3.24.2",
|
|
81
81
|
"langchain": "0.3.30",
|
|
82
82
|
"@langchain/core": "0.3.30"
|
|
83
83
|
},
|
|
@@ -27,19 +27,19 @@
|
|
|
27
27
|
"dist"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@elizaos/cli": "1.5.12
|
|
31
|
-
"@elizaos/client": "1.5.12
|
|
32
|
-
"@elizaos/core": "1.5.12
|
|
33
|
-
"@elizaos/plugin-bootstrap": "1.5.12
|
|
34
|
-
"@elizaos/plugin-sql": "1.5.12
|
|
35
|
-
"@elizaos/server": "1.5.12
|
|
30
|
+
"@elizaos/cli": "1.5.12",
|
|
31
|
+
"@elizaos/client": "1.5.12",
|
|
32
|
+
"@elizaos/core": "1.5.12",
|
|
33
|
+
"@elizaos/plugin-bootstrap": "1.5.12",
|
|
34
|
+
"@elizaos/plugin-sql": "1.5.12",
|
|
35
|
+
"@elizaos/server": "1.5.12",
|
|
36
36
|
"@tanstack/react-query": "^5.29.0",
|
|
37
37
|
"clsx": "^2.1.1",
|
|
38
38
|
"react": "^18.3.1",
|
|
39
39
|
"react-dom": "^18.3.1",
|
|
40
40
|
"tailwind-merge": "^2.6.0",
|
|
41
41
|
"tailwindcss": "^4.1.10",
|
|
42
|
-
"zod": "
|
|
42
|
+
"zod": "3.24.2"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/react": "^18.3.3",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"GUIDE.md"
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@elizaos/cli": "1.5.12
|
|
36
|
-
"@elizaos/core": "1.5.12
|
|
37
|
-
"@elizaos/plugin-bootstrap": "1.5.12
|
|
35
|
+
"@elizaos/cli": "1.5.12",
|
|
36
|
+
"@elizaos/core": "1.5.12",
|
|
37
|
+
"@elizaos/plugin-bootstrap": "1.5.12",
|
|
38
38
|
"@elizaos/plugin-redpill": "1.2.1",
|
|
39
|
-
"@elizaos/plugin-sql": "1.5.12
|
|
39
|
+
"@elizaos/plugin-sql": "1.5.12",
|
|
40
40
|
"@phala/dstack-sdk": "0.1.11",
|
|
41
41
|
"@solana/web3.js": "1.98.2",
|
|
42
42
|
"@tanstack/react-query": "^5.29.0",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"tailwind-merge": "^2.6.0",
|
|
47
47
|
"tailwindcss": "^4.1.10",
|
|
48
48
|
"viem": "2.30.1",
|
|
49
|
-
"zod": "
|
|
49
|
+
"zod": "3.24.2"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/jsdom": "^21.1.7",
|
|
@@ -48,7 +48,7 @@ describe('Plugin Configuration', () => {
|
|
|
48
48
|
// Test with invalid config should fail validation during init
|
|
49
49
|
const invalidConfig = { TEE_MODE: 'INVALID_MODE' };
|
|
50
50
|
await expect(teeStarterPlugin.init(invalidConfig, mockRuntime)).rejects.toThrow(
|
|
51
|
-
'
|
|
51
|
+
'Invalid plugin configuration'
|
|
52
52
|
);
|
|
53
53
|
} finally {
|
|
54
54
|
// Restore original environment
|
|
@@ -154,9 +154,7 @@ describe('TEE Environment Validation', () => {
|
|
|
154
154
|
try {
|
|
155
155
|
await expect(async () => {
|
|
156
156
|
await teeStarterPlugin.init?.({}, mockRuntime);
|
|
157
|
-
}).toThrow(
|
|
158
|
-
'Wallet secret salt must be at least 8 characters long for security (excluding whitespace)'
|
|
159
|
-
);
|
|
157
|
+
}).toThrow('Wallet secret salt must be at least 8 characters long for security');
|
|
160
158
|
} finally {
|
|
161
159
|
// Restore original argv
|
|
162
160
|
process.argv = originalArgv;
|
|
@@ -191,60 +189,7 @@ describe('TEE Environment Validation', () => {
|
|
|
191
189
|
|
|
192
190
|
await expect(async () => {
|
|
193
191
|
await teeStarterPlugin.init?.({}, mockRuntime);
|
|
194
|
-
}).toThrow('Wallet secret salt must not exceed 128 characters
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
test('should reject whitespace-only salt', async () => {
|
|
198
|
-
// Test various whitespace-only values
|
|
199
|
-
const whitespaceSalts = [' ', '\t\t\t\t', ' \t ', '\n\n\n\n\n\n\n\n'];
|
|
200
|
-
|
|
201
|
-
for (const salt of whitespaceSalts) {
|
|
202
|
-
// Remove argv test detection temporarily to test validation
|
|
203
|
-
const originalArgv = process.argv;
|
|
204
|
-
process.argv = ['node', 'script.js']; // Remove test from argv
|
|
205
|
-
|
|
206
|
-
process.env.NODE_ENV = 'production';
|
|
207
|
-
process.env.TEE_MODE = 'OFF';
|
|
208
|
-
process.env.TEE_VENDOR = 'phala';
|
|
209
|
-
process.env.WALLET_SECRET_SALT = salt;
|
|
210
|
-
|
|
211
|
-
try {
|
|
212
|
-
await expect(async () => {
|
|
213
|
-
await teeStarterPlugin.init?.({}, mockRuntime);
|
|
214
|
-
}).toThrow(
|
|
215
|
-
'Wallet secret salt must be at least 8 characters long for security (excluding whitespace)'
|
|
216
|
-
);
|
|
217
|
-
} finally {
|
|
218
|
-
// Restore original argv
|
|
219
|
-
process.argv = originalArgv;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
test('should trim salt and accept if valid after trimming', async () => {
|
|
225
|
-
// Test values with leading/trailing whitespace that are valid after trimming
|
|
226
|
-
const paddedSalts = [
|
|
227
|
-
' valid_salt_123 ',
|
|
228
|
-
'\tvalid_salt_123\t',
|
|
229
|
-
'\n\nvalid_salt_123\n\n',
|
|
230
|
-
' valid_salt_123 ',
|
|
231
|
-
];
|
|
232
|
-
|
|
233
|
-
for (const salt of paddedSalts) {
|
|
234
|
-
process.env.NODE_ENV = 'production';
|
|
235
|
-
process.env.TEE_MODE = 'OFF';
|
|
236
|
-
process.env.TEE_VENDOR = 'phala';
|
|
237
|
-
process.env.WALLET_SECRET_SALT = salt;
|
|
238
|
-
|
|
239
|
-
let error = null;
|
|
240
|
-
try {
|
|
241
|
-
await teeStarterPlugin.init?.({}, mockRuntime);
|
|
242
|
-
} catch (e) {
|
|
243
|
-
error = e;
|
|
244
|
-
}
|
|
245
|
-
// Should not throw error since trimmed value is valid
|
|
246
|
-
expect(error).toBeNull();
|
|
247
|
-
}
|
|
192
|
+
}).toThrow('Wallet secret salt must not exceed 128 characters');
|
|
248
193
|
});
|
|
249
194
|
});
|
|
250
195
|
|
|
@@ -336,11 +281,10 @@ describe('TEE Environment Validation', () => {
|
|
|
336
281
|
process.env.TEE_VENDOR = ' phala '; // Whitespace around valid value
|
|
337
282
|
process.env.WALLET_SECRET_SALT = ' test_salt_123 '; // Whitespace around valid value
|
|
338
283
|
|
|
339
|
-
//
|
|
340
|
-
// But WALLET_SECRET_SALT is now trimmed and should pass if length is valid after trimming
|
|
284
|
+
// Whitespace should cause validation failure (no auto-trim)
|
|
341
285
|
await expect(async () => {
|
|
342
286
|
await teeStarterPlugin.init?.({}, mockRuntime);
|
|
343
|
-
}).toThrow();
|
|
287
|
+
}).toThrow();
|
|
344
288
|
} finally {
|
|
345
289
|
// Restore original values
|
|
346
290
|
process.argv = originalArgv;
|
|
@@ -28,13 +28,10 @@ const configSchema = z.object({
|
|
|
28
28
|
}
|
|
29
29
|
return val;
|
|
30
30
|
})
|
|
31
|
-
.refine(
|
|
32
|
-
(val)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
{ message: 'TEE_MODE must be one of: OFF, LOCAL, DOCKER, PRODUCTION' }
|
|
37
|
-
),
|
|
31
|
+
.refine((val) => {
|
|
32
|
+
if (!val) return true; // Allow undefined in non-test environments
|
|
33
|
+
return ['OFF', 'LOCAL', 'DOCKER', 'PRODUCTION'].includes(val);
|
|
34
|
+
}, 'TEE_MODE must be one of: OFF, LOCAL, DOCKER, PRODUCTION'),
|
|
38
35
|
|
|
39
36
|
TEE_VENDOR: z
|
|
40
37
|
.string()
|
|
@@ -46,13 +43,10 @@ const configSchema = z.object({
|
|
|
46
43
|
}
|
|
47
44
|
return val;
|
|
48
45
|
})
|
|
49
|
-
.refine(
|
|
50
|
-
(val)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
},
|
|
54
|
-
{ message: 'TEE_VENDOR must be: phala' }
|
|
55
|
-
),
|
|
46
|
+
.refine((val) => {
|
|
47
|
+
if (!val) return true; // Allow undefined in non-test environments
|
|
48
|
+
return val === 'phala';
|
|
49
|
+
}, 'TEE_VENDOR must be: phala'),
|
|
56
50
|
|
|
57
51
|
WALLET_SECRET_SALT: z
|
|
58
52
|
.string()
|
|
@@ -66,33 +60,26 @@ const configSchema = z.object({
|
|
|
66
60
|
}
|
|
67
61
|
if (!val) {
|
|
68
62
|
logger.warn('Warning: Wallet secret salt is not provided');
|
|
69
|
-
return val;
|
|
70
63
|
}
|
|
71
|
-
|
|
72
|
-
return val.trim();
|
|
64
|
+
return val;
|
|
73
65
|
})
|
|
74
66
|
.refine(
|
|
75
67
|
(val) => {
|
|
76
|
-
if (val
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
// Check trimmed length for security (val is already trimmed from transform)
|
|
80
|
-
return val.length >= 8;
|
|
68
|
+
if (!val) return true; // Allow undefined in non-test environments
|
|
69
|
+
const trimmedVal = val.trim();
|
|
70
|
+
return trimmedVal.length >= 8 && trimmedVal.length <= 128;
|
|
81
71
|
},
|
|
82
|
-
{
|
|
83
|
-
message:
|
|
84
|
-
'Wallet secret salt must be at least 8 characters long for security (excluding whitespace)',
|
|
85
|
-
}
|
|
86
|
-
)
|
|
87
|
-
.refine(
|
|
88
72
|
(val) => {
|
|
89
|
-
if (val
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
73
|
+
if (!val) return { message: 'Wallet secret salt is required' };
|
|
74
|
+
const trimmedVal = val.trim();
|
|
75
|
+
if (trimmedVal.length < 8) {
|
|
76
|
+
return { message: 'Wallet secret salt must be at least 8 characters long for security' };
|
|
77
|
+
}
|
|
78
|
+
if (trimmedVal.length > 128) {
|
|
79
|
+
return { message: 'Wallet secret salt must not exceed 128 characters' };
|
|
80
|
+
}
|
|
81
|
+
return { message: 'Invalid wallet secret salt' };
|
|
82
|
+
}
|
|
96
83
|
),
|
|
97
84
|
});
|
|
98
85
|
|
|
@@ -108,8 +95,7 @@ type TeeServiceConfig = {
|
|
|
108
95
|
*/
|
|
109
96
|
const createTeeServiceConfig = (runtime: IAgentRuntime): TeeServiceConfig => ({
|
|
110
97
|
teeClient: new TappdClient(),
|
|
111
|
-
|
|
112
|
-
secretSalt: (process.env.WALLET_SECRET_SALT || 'secret_salt').trim(),
|
|
98
|
+
secretSalt: process.env.WALLET_SECRET_SALT || 'secret_salt',
|
|
113
99
|
runtime,
|
|
114
100
|
});
|
|
115
101
|
|
|
@@ -274,36 +260,9 @@ const teeStarterPlugin: Plugin = {
|
|
|
274
260
|
}
|
|
275
261
|
} catch (error) {
|
|
276
262
|
if (error instanceof z.ZodError) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
(e) => e.path[0] === 'TEE_MODE' && e.message.includes('TEE_MODE must be')
|
|
280
|
-
);
|
|
281
|
-
if (hasInvalidMode) {
|
|
282
|
-
// Throw the specific validation error for TEE_MODE
|
|
283
|
-
const teeError = error.issues.find((e) => e.path[0] === 'TEE_MODE');
|
|
284
|
-
throw new Error(
|
|
285
|
-
teeError?.message || 'TEE_MODE must be one of: OFF, LOCAL, DOCKER, PRODUCTION'
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Check if this is validation with an invalid TEE_VENDOR from the test
|
|
290
|
-
const hasInvalidVendor = error.issues.some(
|
|
291
|
-
(e) => e.path[0] === 'TEE_VENDOR' && e.message.includes('TEE_VENDOR must be')
|
|
263
|
+
throw new Error(
|
|
264
|
+
`Invalid plugin configuration: ${error.errors.map((e) => e.message).join(', ')}`
|
|
292
265
|
);
|
|
293
|
-
if (hasInvalidVendor) {
|
|
294
|
-
const vendorError = error.issues.find((e) => e.path[0] === 'TEE_VENDOR');
|
|
295
|
-
throw new Error(vendorError?.message || 'TEE_VENDOR must be: phala');
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Check if this is validation with an invalid WALLET_SECRET_SALT from the test
|
|
299
|
-
const hasSaltError = error.issues.some((e) => e.path[0] === 'WALLET_SECRET_SALT');
|
|
300
|
-
if (hasSaltError) {
|
|
301
|
-
const saltError = error.issues.find((e) => e.path[0] === 'WALLET_SECRET_SALT');
|
|
302
|
-
throw new Error(saltError?.message || 'Invalid wallet secret salt');
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// Generic invalid configuration error
|
|
306
|
-
throw new Error('Invalid plugin configuration');
|
|
307
266
|
}
|
|
308
267
|
throw error;
|
|
309
268
|
}
|