chainlesschain 0.47.9 → 0.49.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/bin/chainlesschain.js +0 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AppLayout-6SPt_8Y_.js → AppLayout-Rvi759IS.js} +1 -1
- package/src/assets/web-panel/assets/Dashboard-BS-tzGNj.css +1 -0
- package/src/assets/web-panel/assets/{Dashboard-Br7kCwKJ.js → Dashboard-DBhFxXYQ.js} +2 -2
- package/src/assets/web-panel/assets/{index-tN-8TosE.js → index-uL0cZ8N_.js} +2 -2
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/codegen.js +303 -0
- package/src/commands/collab.js +482 -0
- package/src/commands/crosschain.js +382 -0
- package/src/commands/dbevo.js +388 -0
- package/src/commands/dev.js +411 -0
- package/src/commands/federation.js +427 -0
- package/src/commands/fusion.js +332 -0
- package/src/commands/governance.js +505 -0
- package/src/commands/hardening.js +110 -0
- package/src/commands/incentive.js +373 -0
- package/src/commands/inference.js +304 -0
- package/src/commands/infra.js +361 -0
- package/src/commands/kg.js +371 -0
- package/src/commands/marketplace.js +326 -0
- package/src/commands/mcp.js +97 -18
- package/src/commands/nlprog.js +329 -0
- package/src/commands/ops.js +408 -0
- package/src/commands/perception.js +385 -0
- package/src/commands/pqc.js +34 -0
- package/src/commands/privacy.js +345 -0
- package/src/commands/quantization.js +280 -0
- package/src/commands/recommend.js +336 -0
- package/src/commands/reputation.js +349 -0
- package/src/commands/runtime.js +500 -0
- package/src/commands/sla.js +352 -0
- package/src/commands/stress.js +252 -0
- package/src/commands/tech.js +268 -0
- package/src/commands/tenant.js +576 -0
- package/src/commands/trust.js +366 -0
- package/src/harness/mcp-client.js +330 -54
- package/src/index.js +112 -0
- package/src/lib/aiops.js +523 -0
- package/src/lib/autonomous-developer.js +524 -0
- package/src/lib/code-agent.js +442 -0
- package/src/lib/collaboration-governance.js +556 -0
- package/src/lib/community-governance.js +649 -0
- package/src/lib/content-recommendation.js +600 -0
- package/src/lib/cross-chain.js +669 -0
- package/src/lib/dbevo.js +669 -0
- package/src/lib/decentral-infra.js +445 -0
- package/src/lib/federation-hardening.js +587 -0
- package/src/lib/hardening-manager.js +409 -0
- package/src/lib/inference-network.js +407 -0
- package/src/lib/knowledge-graph.js +530 -0
- package/src/lib/mcp-client.js +3 -0
- package/src/lib/multimodal.js +698 -0
- package/src/lib/nl-programming.js +595 -0
- package/src/lib/perception.js +500 -0
- package/src/lib/pqc-manager.js +141 -9
- package/src/lib/privacy-computing.js +575 -0
- package/src/lib/protocol-fusion.js +535 -0
- package/src/lib/quantization.js +362 -0
- package/src/lib/reputation-optimizer.js +509 -0
- package/src/lib/skill-marketplace.js +397 -0
- package/src/lib/sla-manager.js +484 -0
- package/src/lib/stress-tester.js +383 -0
- package/src/lib/tech-learning-engine.js +651 -0
- package/src/lib/tenant-saas.js +831 -0
- package/src/lib/token-incentive.js +513 -0
- package/src/lib/trust-security.js +473 -0
- package/src/lib/universal-runtime.js +771 -0
- package/src/assets/web-panel/assets/Dashboard-CKeMmCoT.css +0 -1
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomous Developer commands (Phase 63)
|
|
3
|
+
* chainlesschain dev levels|phases|refactor-types|start|list|show|phase|
|
|
4
|
+
* pause|resume|complete|fail|review|adr|adrs
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { logger } from "../lib/logger.js";
|
|
9
|
+
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
10
|
+
import {
|
|
11
|
+
ensureAutonomousDevTables,
|
|
12
|
+
listAutonomyLevels,
|
|
13
|
+
listPhases,
|
|
14
|
+
listRefactoringTypes,
|
|
15
|
+
startDevSession,
|
|
16
|
+
getSession,
|
|
17
|
+
listSessions,
|
|
18
|
+
advancePhase,
|
|
19
|
+
pauseSession,
|
|
20
|
+
resumeSession,
|
|
21
|
+
completeSession,
|
|
22
|
+
failSession,
|
|
23
|
+
reviewCode,
|
|
24
|
+
recordADR,
|
|
25
|
+
listADRs,
|
|
26
|
+
renderADR,
|
|
27
|
+
AUTONOMY_LEVELS,
|
|
28
|
+
} from "../lib/autonomous-developer.js";
|
|
29
|
+
|
|
30
|
+
function _dbFromCtx(ctx) {
|
|
31
|
+
if (!ctx.db) {
|
|
32
|
+
logger.error("Database not available");
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const db = ctx.db.getDatabase();
|
|
36
|
+
ensureAutonomousDevTables(db);
|
|
37
|
+
return db;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function _printSession(s) {
|
|
41
|
+
logger.log(
|
|
42
|
+
` ${chalk.bold("ID:")} ${chalk.cyan(s.sessionId.slice(0, 8))}`,
|
|
43
|
+
);
|
|
44
|
+
logger.log(` ${chalk.bold("Req:")} ${s.requirement}`);
|
|
45
|
+
logger.log(` ${chalk.bold("Phase:")} ${s.currentPhase}`);
|
|
46
|
+
logger.log(` ${chalk.bold("Status:")} ${s.status}`);
|
|
47
|
+
logger.log(` ${chalk.bold("Autonomy:")} L${s.autonomyLevel}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function registerDevCommand(program) {
|
|
51
|
+
const dev = program
|
|
52
|
+
.command("dev")
|
|
53
|
+
.description(
|
|
54
|
+
"Autonomous developer — dev sessions, ADRs, code review, refactor catalog",
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
dev
|
|
58
|
+
.command("levels")
|
|
59
|
+
.description("List autonomy levels (L0-L4)")
|
|
60
|
+
.option("--json", "Output as JSON")
|
|
61
|
+
.action((options) => {
|
|
62
|
+
const levels = listAutonomyLevels();
|
|
63
|
+
if (options.json) {
|
|
64
|
+
console.log(JSON.stringify(levels, null, 2));
|
|
65
|
+
} else {
|
|
66
|
+
for (const l of levels) {
|
|
67
|
+
logger.log(
|
|
68
|
+
` ${chalk.cyan(`L${l.level}`)} ${chalk.bold(l.name.padEnd(18))} ${l.description}`,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
dev
|
|
75
|
+
.command("phases")
|
|
76
|
+
.description("List development phases in order")
|
|
77
|
+
.option("--json", "Output as JSON")
|
|
78
|
+
.action((options) => {
|
|
79
|
+
const phases = listPhases();
|
|
80
|
+
if (options.json) {
|
|
81
|
+
console.log(JSON.stringify(phases, null, 2));
|
|
82
|
+
} else {
|
|
83
|
+
for (let i = 0; i < phases.length; i++) {
|
|
84
|
+
logger.log(` ${chalk.cyan(`${i + 1}.`)} ${phases[i]}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
dev
|
|
90
|
+
.command("refactor-types")
|
|
91
|
+
.description("List known refactoring types")
|
|
92
|
+
.option("--json", "Output as JSON")
|
|
93
|
+
.action((options) => {
|
|
94
|
+
const types = listRefactoringTypes();
|
|
95
|
+
if (options.json) {
|
|
96
|
+
console.log(JSON.stringify(types, null, 2));
|
|
97
|
+
} else {
|
|
98
|
+
for (const t of types) logger.log(` ${chalk.cyan(t)}`);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
dev
|
|
103
|
+
.command("start <requirement>")
|
|
104
|
+
.description("Start a new dev session")
|
|
105
|
+
.option("-l, --level <n>", "Autonomy level 0..4", parseInt, 2)
|
|
106
|
+
.option("-b, --by <author>", "createdBy tag")
|
|
107
|
+
.option("--json", "Output as JSON")
|
|
108
|
+
.action(async (requirement, options) => {
|
|
109
|
+
try {
|
|
110
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
111
|
+
const db = _dbFromCtx(ctx);
|
|
112
|
+
const session = startDevSession(db, {
|
|
113
|
+
requirement,
|
|
114
|
+
autonomyLevel: options.level,
|
|
115
|
+
createdBy: options.by,
|
|
116
|
+
});
|
|
117
|
+
if (options.json) {
|
|
118
|
+
console.log(JSON.stringify(session, null, 2));
|
|
119
|
+
} else {
|
|
120
|
+
logger.success("Dev session started");
|
|
121
|
+
_printSession(session);
|
|
122
|
+
}
|
|
123
|
+
await shutdown();
|
|
124
|
+
} catch (err) {
|
|
125
|
+
logger.error(`Failed: ${err.message}`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
dev
|
|
131
|
+
.command("list")
|
|
132
|
+
.description("List dev sessions")
|
|
133
|
+
.option(
|
|
134
|
+
"-s, --status <s>",
|
|
135
|
+
"Filter by status (active|paused|completed|failed)",
|
|
136
|
+
)
|
|
137
|
+
.option("-p, --phase <p>", "Filter by phase")
|
|
138
|
+
.option("--limit <n>", "Maximum entries", parseInt, 50)
|
|
139
|
+
.option("--json", "Output as JSON")
|
|
140
|
+
.action(async (options) => {
|
|
141
|
+
try {
|
|
142
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
143
|
+
_dbFromCtx(ctx);
|
|
144
|
+
const rows = listSessions({
|
|
145
|
+
status: options.status,
|
|
146
|
+
phase: options.phase,
|
|
147
|
+
limit: options.limit,
|
|
148
|
+
});
|
|
149
|
+
if (options.json) {
|
|
150
|
+
console.log(JSON.stringify(rows, null, 2));
|
|
151
|
+
} else if (rows.length === 0) {
|
|
152
|
+
logger.info("No dev sessions.");
|
|
153
|
+
} else {
|
|
154
|
+
for (const s of rows) {
|
|
155
|
+
logger.log(
|
|
156
|
+
` ${chalk.cyan(s.sessionId.slice(0, 8))} L${s.autonomyLevel} [${s.status.padEnd(9)}] ${s.currentPhase.padEnd(22)} ${s.requirement}`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
await shutdown();
|
|
161
|
+
} catch (err) {
|
|
162
|
+
logger.error(`Failed: ${err.message}`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
dev
|
|
168
|
+
.command("show <session-id>")
|
|
169
|
+
.description("Show full details of a dev session")
|
|
170
|
+
.option("--json", "Output as JSON")
|
|
171
|
+
.action(async (sessionId, options) => {
|
|
172
|
+
try {
|
|
173
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
174
|
+
_dbFromCtx(ctx);
|
|
175
|
+
const session = getSession(sessionId);
|
|
176
|
+
if (!session) {
|
|
177
|
+
logger.error(`Session not found: ${sessionId}`);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
if (options.json) {
|
|
181
|
+
console.log(JSON.stringify(session, null, 2));
|
|
182
|
+
} else {
|
|
183
|
+
_printSession(session);
|
|
184
|
+
if (session.reviewFeedback) {
|
|
185
|
+
logger.log(
|
|
186
|
+
` ${chalk.bold("Feedback:")} ${JSON.stringify(session.reviewFeedback).slice(0, 120)}`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
await shutdown();
|
|
191
|
+
} catch (err) {
|
|
192
|
+
logger.error(`Failed: ${err.message}`);
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
dev
|
|
198
|
+
.command("phase <session-id> <phase>")
|
|
199
|
+
.description("Advance a session to a new phase")
|
|
200
|
+
.option("--json", "Output as JSON")
|
|
201
|
+
.action(async (sessionId, phase, options) => {
|
|
202
|
+
try {
|
|
203
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
204
|
+
const db = _dbFromCtx(ctx);
|
|
205
|
+
const session = advancePhase(db, sessionId, phase);
|
|
206
|
+
if (options.json) {
|
|
207
|
+
console.log(JSON.stringify(session, null, 2));
|
|
208
|
+
} else {
|
|
209
|
+
logger.success(`Phase advanced → ${session.currentPhase}`);
|
|
210
|
+
}
|
|
211
|
+
await shutdown();
|
|
212
|
+
} catch (err) {
|
|
213
|
+
logger.error(`Failed: ${err.message}`);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
dev
|
|
219
|
+
.command("pause <session-id>")
|
|
220
|
+
.description("Pause an active session")
|
|
221
|
+
.action(async (sessionId) => {
|
|
222
|
+
try {
|
|
223
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
224
|
+
const db = _dbFromCtx(ctx);
|
|
225
|
+
pauseSession(db, sessionId);
|
|
226
|
+
logger.success(`Paused ${sessionId.slice(0, 8)}`);
|
|
227
|
+
await shutdown();
|
|
228
|
+
} catch (err) {
|
|
229
|
+
logger.error(`Failed: ${err.message}`);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
dev
|
|
235
|
+
.command("resume <session-id>")
|
|
236
|
+
.description("Resume a paused session")
|
|
237
|
+
.action(async (sessionId) => {
|
|
238
|
+
try {
|
|
239
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
240
|
+
const db = _dbFromCtx(ctx);
|
|
241
|
+
resumeSession(db, sessionId);
|
|
242
|
+
logger.success(`Resumed ${sessionId.slice(0, 8)}`);
|
|
243
|
+
await shutdown();
|
|
244
|
+
} catch (err) {
|
|
245
|
+
logger.error(`Failed: ${err.message}`);
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
dev
|
|
251
|
+
.command("complete <session-id>")
|
|
252
|
+
.description("Mark a session completed")
|
|
253
|
+
.action(async (sessionId) => {
|
|
254
|
+
try {
|
|
255
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
256
|
+
const db = _dbFromCtx(ctx);
|
|
257
|
+
completeSession(db, sessionId);
|
|
258
|
+
logger.success(`Completed ${sessionId.slice(0, 8)}`);
|
|
259
|
+
await shutdown();
|
|
260
|
+
} catch (err) {
|
|
261
|
+
logger.error(`Failed: ${err.message}`);
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
dev
|
|
267
|
+
.command("fail <session-id>")
|
|
268
|
+
.description("Mark a session failed")
|
|
269
|
+
.option("-r, --reason <text>", "Failure reason")
|
|
270
|
+
.action(async (sessionId, options) => {
|
|
271
|
+
try {
|
|
272
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
273
|
+
const db = _dbFromCtx(ctx);
|
|
274
|
+
failSession(db, sessionId, options.reason);
|
|
275
|
+
logger.success(`Failed ${sessionId.slice(0, 8)}`);
|
|
276
|
+
await shutdown();
|
|
277
|
+
} catch (err) {
|
|
278
|
+
logger.error(`Failed: ${err.message}`);
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
dev
|
|
284
|
+
.command("review <file>")
|
|
285
|
+
.description(
|
|
286
|
+
"Review a file using heuristics (delegates to detectAntiPatterns)",
|
|
287
|
+
)
|
|
288
|
+
.option("-s, --session <id>", "Attach review to a session")
|
|
289
|
+
.option("--min-score <n>", "Minimum passing score 0..1", parseFloat, 0.7)
|
|
290
|
+
.option("--json", "Output as JSON")
|
|
291
|
+
.action(async (file, options) => {
|
|
292
|
+
try {
|
|
293
|
+
let db = null;
|
|
294
|
+
if (options.session) {
|
|
295
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
296
|
+
db = _dbFromCtx(ctx);
|
|
297
|
+
}
|
|
298
|
+
const result = reviewCode(file, {
|
|
299
|
+
sessionId: options.session,
|
|
300
|
+
db,
|
|
301
|
+
minScore: options.minScore,
|
|
302
|
+
});
|
|
303
|
+
if (options.json) {
|
|
304
|
+
console.log(JSON.stringify(result, null, 2));
|
|
305
|
+
} else {
|
|
306
|
+
const color = result.passed ? chalk.green : chalk.yellow;
|
|
307
|
+
logger.log(
|
|
308
|
+
` ${color(`Grade ${result.grade}`)} score=${result.score} findings=${result.totalFindings}`,
|
|
309
|
+
);
|
|
310
|
+
for (const f of result.findings) {
|
|
311
|
+
logger.log(
|
|
312
|
+
` ${chalk.yellow(f.type.padEnd(22))} [${f.severity}] ${f.detail}`,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (options.session) await shutdown();
|
|
317
|
+
} catch (err) {
|
|
318
|
+
logger.error(`Failed: ${err.message}`);
|
|
319
|
+
process.exit(1);
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
dev
|
|
324
|
+
.command("adr <session-id> <title> <decision>")
|
|
325
|
+
.description("Record an Architecture Decision Record for a session")
|
|
326
|
+
.option("-c, --context <text>", "Decision context", "")
|
|
327
|
+
.option("-q, --consequences <text>", "Consequences", "")
|
|
328
|
+
.option("-a, --alternatives <csv>", "Comma-separated alternatives", "")
|
|
329
|
+
.option(
|
|
330
|
+
"-s, --status <s>",
|
|
331
|
+
"proposed|accepted|deprecated|superseded",
|
|
332
|
+
"accepted",
|
|
333
|
+
)
|
|
334
|
+
.option("--render", "Render ADR markdown")
|
|
335
|
+
.option("--json", "Output as JSON")
|
|
336
|
+
.action(async (sessionId, title, decision, options) => {
|
|
337
|
+
try {
|
|
338
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
339
|
+
const db = _dbFromCtx(ctx);
|
|
340
|
+
const alternatives = options.alternatives
|
|
341
|
+
? options.alternatives
|
|
342
|
+
.split(",")
|
|
343
|
+
.map((s) => s.trim())
|
|
344
|
+
.filter(Boolean)
|
|
345
|
+
: [];
|
|
346
|
+
const context = options.context || `Session ${sessionId.slice(0, 8)}`;
|
|
347
|
+
const adr = recordADR(db, {
|
|
348
|
+
sessionId,
|
|
349
|
+
title,
|
|
350
|
+
decision,
|
|
351
|
+
context,
|
|
352
|
+
consequences: options.consequences,
|
|
353
|
+
alternatives,
|
|
354
|
+
status: options.status,
|
|
355
|
+
});
|
|
356
|
+
if (options.json) {
|
|
357
|
+
console.log(JSON.stringify(adr, null, 2));
|
|
358
|
+
} else if (options.render) {
|
|
359
|
+
console.log(renderADR(adr));
|
|
360
|
+
} else {
|
|
361
|
+
logger.success("ADR recorded");
|
|
362
|
+
logger.log(
|
|
363
|
+
` ${chalk.bold("ID:")} ${chalk.cyan(adr.adrId.slice(0, 8))}`,
|
|
364
|
+
);
|
|
365
|
+
logger.log(` ${chalk.bold("Title:")} ${adr.title}`);
|
|
366
|
+
logger.log(` ${chalk.bold("Status:")} ${adr.status}`);
|
|
367
|
+
}
|
|
368
|
+
await shutdown();
|
|
369
|
+
} catch (err) {
|
|
370
|
+
logger.error(`Failed: ${err.message}`);
|
|
371
|
+
process.exit(1);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
dev
|
|
376
|
+
.command("adrs")
|
|
377
|
+
.description("List ADRs (optionally filter by session or status)")
|
|
378
|
+
.option("-s, --session <id>", "Filter by session")
|
|
379
|
+
.option("-S, --status <s>", "Filter by status")
|
|
380
|
+
.option("--limit <n>", "Maximum entries", parseInt, 50)
|
|
381
|
+
.option("--json", "Output as JSON")
|
|
382
|
+
.action(async (options) => {
|
|
383
|
+
try {
|
|
384
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
385
|
+
_dbFromCtx(ctx);
|
|
386
|
+
const rows = listADRs({
|
|
387
|
+
sessionId: options.session,
|
|
388
|
+
status: options.status,
|
|
389
|
+
limit: options.limit,
|
|
390
|
+
});
|
|
391
|
+
if (options.json) {
|
|
392
|
+
console.log(JSON.stringify(rows, null, 2));
|
|
393
|
+
} else if (rows.length === 0) {
|
|
394
|
+
logger.info("No ADRs.");
|
|
395
|
+
} else {
|
|
396
|
+
for (const a of rows) {
|
|
397
|
+
logger.log(
|
|
398
|
+
` ${chalk.cyan(a.adrId.slice(0, 8))} [${a.status.padEnd(11)}] ${chalk.bold(a.title)}`,
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
await shutdown();
|
|
403
|
+
} catch (err) {
|
|
404
|
+
logger.error(`Failed: ${err.message}`);
|
|
405
|
+
process.exit(1);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// silence unused import lints (AUTONOMY_LEVELS re-exported for consumers)
|
|
410
|
+
void AUTONOMY_LEVELS;
|
|
411
|
+
}
|