@nexrall/code-core 1.4.70 → 1.4.72
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/agent/agentRegistry.d.ts.map +1 -1
- package/dist/agent/agentRegistry.js +28 -10
- package/dist/agent/agentTypes.d.ts.map +1 -1
- package/dist/agent/agentTypes.js +159 -48
- package/dist/agent/askOnce.d.ts.map +1 -1
- package/dist/agent/askOnce.js +14 -5
- package/dist/agent/backgroundAgents.d.ts.map +1 -1
- package/dist/agent/backgroundAgents.js +22 -8
- package/dist/agent/claimEvidence.d.ts.map +1 -1
- package/dist/agent/claimEvidence.js +2 -1
- package/dist/agent/compaction.d.ts.map +1 -1
- package/dist/agent/compaction.js +31 -10
- package/dist/agent/crossProcessLock.d.ts.map +1 -1
- package/dist/agent/crossProcessLock.js +15 -7
- package/dist/agent/editCompleteness.d.ts.map +1 -1
- package/dist/agent/fileLocks.d.ts.map +1 -1
- package/dist/agent/fileLocks.js +14 -5
- package/dist/agent/flaky.d.ts.map +1 -1
- package/dist/agent/hooks.d.ts.map +1 -1
- package/dist/agent/hooks.js +284 -74
- package/dist/agent/iterationPolicy.d.ts.map +1 -1
- package/dist/agent/iterationPolicy.js +28 -25
- package/dist/agent/lifecycleHost.d.ts.map +1 -1
- package/dist/agent/lifecycleHost.js +36 -12
- package/dist/agent/loop.d.ts +22 -4
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +223 -51
- package/dist/agent/memory.d.ts.map +1 -1
- package/dist/agent/memory.js +13 -7
- package/dist/agent/modelCatalogue.d.ts.map +1 -1
- package/dist/agent/modelCatalogue.js +4 -1
- package/dist/agent/nestedInstructions.d.ts +122 -0
- package/dist/agent/nestedInstructions.d.ts.map +1 -0
- package/dist/agent/nestedInstructions.js +696 -0
- package/dist/agent/peerRegistry.d.ts.map +1 -1
- package/dist/agent/peerRegistry.js +44 -6
- package/dist/agent/peerTransport.d.ts.map +1 -1
- package/dist/agent/peerTransport.js +18 -6
- package/dist/agent/planMode.d.ts.map +1 -1
- package/dist/agent/planMode.js +194 -41
- package/dist/agent/readDedupe.d.ts.map +1 -1
- package/dist/agent/readDedupe.js +3 -1
- package/dist/agent/securityLint.d.ts.map +1 -1
- package/dist/agent/sharedTasks.d.ts.map +1 -1
- package/dist/agent/sharedTasks.js +20 -5
- package/dist/agent/skills.d.ts +79 -0
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +403 -14
- package/dist/agent/subAgentBudget.d.ts.map +1 -1
- package/dist/agent/subTask.d.ts.map +1 -1
- package/dist/agent/subTask.js +87 -37
- package/dist/agent/subTaskSupport.d.ts.map +1 -1
- package/dist/agent/subTaskSupport.js +43 -14
- package/dist/agent/testIntegrity.d.ts.map +1 -1
- package/dist/agent/testIntegrity.js +5 -3
- package/dist/agent/toolDescriptions.d.ts.map +1 -1
- package/dist/agent/toolPrefetch.d.ts.map +1 -1
- package/dist/agent/toolPrefetch.js +15 -11
- package/dist/agent/trust.d.ts.map +1 -1
- package/dist/agent/trust.js +6 -2
- package/dist/agent/worktree.d.ts.map +1 -1
- package/dist/agent/worktree.js +70 -16
- package/dist/agent/worktreeEnforcement.d.ts.map +1 -1
- package/dist/agent/worktreeEnforcement.js +9 -4
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +67 -32
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -1
- package/dist/checkpoint/manager.d.ts.map +1 -1
- package/dist/checkpoint/manager.js +23 -8
- package/dist/commands/loader.d.ts.map +1 -1
- package/dist/commands/loader.js +6 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/mcp/client.d.ts +34 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +89 -24
- package/dist/mcp/httpClient.d.ts +24 -1
- package/dist/mcp/httpClient.d.ts.map +1 -1
- package/dist/mcp/httpClient.js +80 -14
- package/dist/mcp/instructions.d.ts +11 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +42 -0
- package/dist/mcp/manager.d.ts +24 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +117 -24
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +48 -14
- package/dist/mcp/sseClient.d.ts +9 -1
- package/dist/mcp/sseClient.d.ts.map +1 -1
- package/dist/mcp/sseClient.js +43 -10
- package/dist/mcp/stats.d.ts.map +1 -1
- package/dist/permissions/bashClassify.d.ts.map +1 -1
- package/dist/permissions/bashClassify.js +25 -3
- package/dist/permissions/destructive.d.ts.map +1 -1
- package/dist/permissions/destructive.js +7 -2
- package/dist/permissions/destructiveTokens.d.ts.map +1 -1
- package/dist/permissions/destructiveTokens.js +104 -24
- package/dist/permissions/modePolicy.d.ts.map +1 -1
- package/dist/permissions/modePolicy.js +40 -17
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +7 -5
- package/dist/plugins/data.d.ts.map +1 -1
- package/dist/plugins/data.js +6 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +18 -7
- package/dist/plugins/installer.d.ts.map +1 -1
- package/dist/plugins/installer.js +17 -10
- package/dist/plugins/sources.d.ts.map +1 -1
- package/dist/plugins/sources.js +9 -3
- package/dist/tools/executor.d.ts.map +1 -1
- package/dist/tools/executor.js +470 -173
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +5 -1
- package/dist/tools/symbols.d.ts.map +1 -1
- package/dist/tools/symbols.js +30 -8
- package/dist/tools/tsLangService.d.ts.map +1 -1
- package/dist/tools/tsLangService.js +12 -4
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/util/frontmatter.d.ts.map +1 -1
- package/dist/util/miniYaml.d.ts.map +1 -1
- package/dist/util/miniYaml.js +4 -2
- package/package.json +1 -1
package/dist/agent/worktree.js
CHANGED
|
@@ -98,18 +98,31 @@ const WORKTREE_ROOT_DIRNAME = '.nexrall/worktrees';
|
|
|
98
98
|
// reproducible artifacts. A project can still get everything copied verbatim
|
|
99
99
|
// by using its OWN hook instead of the built-in copy fallback.
|
|
100
100
|
const COPY_SKIP_DIRS = new Set([
|
|
101
|
-
'.git',
|
|
102
|
-
'
|
|
101
|
+
'.git',
|
|
102
|
+
'node_modules',
|
|
103
|
+
'dist',
|
|
104
|
+
'build',
|
|
105
|
+
'.next',
|
|
106
|
+
'__pycache__',
|
|
107
|
+
'.venv',
|
|
108
|
+
'venv',
|
|
109
|
+
'.nexrall',
|
|
110
|
+
'.svn',
|
|
111
|
+
'.hg',
|
|
103
112
|
]);
|
|
104
113
|
function isGitRepo(dir) {
|
|
105
114
|
try {
|
|
106
115
|
const r = (0, child_process_1.spawnSync)('git', ['rev-parse', '--show-toplevel'], {
|
|
107
|
-
cwd: dir,
|
|
116
|
+
cwd: dir,
|
|
117
|
+
encoding: 'utf-8',
|
|
118
|
+
timeout: 5000,
|
|
108
119
|
});
|
|
109
120
|
if (r.status === 0 && r.stdout)
|
|
110
121
|
return { ok: true, root: r.stdout.trim() };
|
|
111
122
|
}
|
|
112
|
-
catch {
|
|
123
|
+
catch {
|
|
124
|
+
/* git not installed or not a repo */
|
|
125
|
+
}
|
|
113
126
|
return { ok: false };
|
|
114
127
|
}
|
|
115
128
|
/** Generate a readable random name, same shape Claude Code uses ("bright-running-fox"). */
|
|
@@ -177,7 +190,9 @@ function copyRecursive(src, dest) {
|
|
|
177
190
|
try {
|
|
178
191
|
fs.symlinkSync(fs.readlinkSync(s), d);
|
|
179
192
|
}
|
|
180
|
-
catch {
|
|
193
|
+
catch {
|
|
194
|
+
/* best-effort */
|
|
195
|
+
}
|
|
181
196
|
}
|
|
182
197
|
else if (entry.isDirectory()) {
|
|
183
198
|
copyRecursive(s, d);
|
|
@@ -222,7 +237,11 @@ function createWorktree(workDir, requestedName) {
|
|
|
222
237
|
if (git.ok && git.root) {
|
|
223
238
|
fs.mkdirSync(root, { recursive: true });
|
|
224
239
|
const branch = `worktree-${name}`;
|
|
225
|
-
const r = (0, child_process_1.spawnSync)('git', ['worktree', 'add', '-b', branch, worktreePath], {
|
|
240
|
+
const r = (0, child_process_1.spawnSync)('git', ['worktree', 'add', '-b', branch, worktreePath], {
|
|
241
|
+
cwd: git.root,
|
|
242
|
+
encoding: 'utf-8',
|
|
243
|
+
timeout: 30000,
|
|
244
|
+
});
|
|
226
245
|
if (r.status !== 0) {
|
|
227
246
|
return { ok: false, error: `git worktree add failed: ${(r.stderr ?? r.stdout ?? '').trim() || 'unknown error'}` };
|
|
228
247
|
}
|
|
@@ -246,7 +265,9 @@ function worktreeHasWork(state) {
|
|
|
246
265
|
if (state.backend === 'git') {
|
|
247
266
|
try {
|
|
248
267
|
const status = (0, child_process_1.spawnSync)('git', ['status', '--porcelain'], {
|
|
249
|
-
cwd: state.worktreePath,
|
|
268
|
+
cwd: state.worktreePath,
|
|
269
|
+
encoding: 'utf-8',
|
|
270
|
+
timeout: 10000,
|
|
250
271
|
});
|
|
251
272
|
// Filter our own bookkeeping file out of the porcelain output before
|
|
252
273
|
// deciding — see writeMetadata's comment on why this is filtered here
|
|
@@ -258,7 +279,11 @@ function worktreeHasWork(state) {
|
|
|
258
279
|
if (meaningfulLines.length > 0)
|
|
259
280
|
return true;
|
|
260
281
|
// Also check for unpushed commits on the worktree's own branch.
|
|
261
|
-
const unpushed = (0, child_process_1.spawnSync)('git', ['log', '@{u}..HEAD', '--oneline'], {
|
|
282
|
+
const unpushed = (0, child_process_1.spawnSync)('git', ['log', '@{u}..HEAD', '--oneline'], {
|
|
283
|
+
cwd: state.worktreePath,
|
|
284
|
+
encoding: 'utf-8',
|
|
285
|
+
timeout: 10000,
|
|
286
|
+
});
|
|
262
287
|
if (unpushed.status === 0 && unpushed.stdout && unpushed.stdout.trim().length > 0)
|
|
263
288
|
return true;
|
|
264
289
|
return false;
|
|
@@ -283,7 +308,11 @@ function removeWorktree(state, opts = {}) {
|
|
|
283
308
|
if (!opts.force && worktreeHasWork(state)) {
|
|
284
309
|
return { ok: false, hadWork: true };
|
|
285
310
|
}
|
|
286
|
-
const hookEnv = {
|
|
311
|
+
const hookEnv = {
|
|
312
|
+
NEXRALL_WORKTREE_NAME: state.name,
|
|
313
|
+
NEXRALL_WORKTREE_PATH: state.worktreePath,
|
|
314
|
+
NEXRALL_MAIN_CHECKOUT: state.mainCheckout,
|
|
315
|
+
};
|
|
287
316
|
if (state.backend === 'hook') {
|
|
288
317
|
const hook = runWorktreeHook(state.mainCheckout, 'exit', hookEnv);
|
|
289
318
|
if (hook.ran && !hook.ok)
|
|
@@ -304,10 +333,19 @@ function removeWorktree(state, opts = {}) {
|
|
|
304
333
|
try {
|
|
305
334
|
fs.unlinkSync(metadataPath(state.worktreePath));
|
|
306
335
|
}
|
|
307
|
-
catch {
|
|
308
|
-
|
|
336
|
+
catch {
|
|
337
|
+
/* fine if already gone */
|
|
338
|
+
}
|
|
339
|
+
const r = (0, child_process_1.spawnSync)('git', ['worktree', 'remove', state.worktreePath, ...(opts.force ? ['--force'] : [])], {
|
|
340
|
+
cwd: state.mainCheckout,
|
|
341
|
+
encoding: 'utf-8',
|
|
342
|
+
timeout: 30000,
|
|
343
|
+
});
|
|
309
344
|
if (r.status !== 0) {
|
|
310
|
-
return {
|
|
345
|
+
return {
|
|
346
|
+
ok: false,
|
|
347
|
+
error: `git worktree remove failed: ${(r.stderr ?? r.stdout ?? '').trim() || 'unknown error'}`,
|
|
348
|
+
};
|
|
311
349
|
}
|
|
312
350
|
// Also drop the branch — an unnamed worktree's branch is disposable once
|
|
313
351
|
// its worktree is gone (mirrors Claude Code's automatic cleanup for
|
|
@@ -338,7 +376,11 @@ function removeWorktree(state, opts = {}) {
|
|
|
338
376
|
function enterWorktree(state) {
|
|
339
377
|
if (state.backend !== 'hook')
|
|
340
378
|
return { ok: true };
|
|
341
|
-
const hookEnv = {
|
|
379
|
+
const hookEnv = {
|
|
380
|
+
NEXRALL_WORKTREE_NAME: state.name,
|
|
381
|
+
NEXRALL_WORKTREE_PATH: state.worktreePath,
|
|
382
|
+
NEXRALL_MAIN_CHECKOUT: state.mainCheckout,
|
|
383
|
+
};
|
|
342
384
|
const hook = runWorktreeHook(state.mainCheckout, 'enter', hookEnv);
|
|
343
385
|
if (hook.ran && !hook.ok)
|
|
344
386
|
return { ok: false, error: `worktree-enter hook failed: ${hook.output ?? 'unknown error'}` };
|
|
@@ -374,7 +416,9 @@ function realOrLexical(p) {
|
|
|
374
416
|
try {
|
|
375
417
|
return fs.realpathSync(p);
|
|
376
418
|
}
|
|
377
|
-
catch {
|
|
419
|
+
catch {
|
|
420
|
+
/* fall through — p (or a piece of it) doesn't exist yet */
|
|
421
|
+
}
|
|
378
422
|
let dir = path.dirname(p);
|
|
379
423
|
const tail = [path.basename(p)];
|
|
380
424
|
for (;;) {
|
|
@@ -449,7 +493,9 @@ function writeMetadata(state) {
|
|
|
449
493
|
// filename out of `git status --porcelain`'s output directly — no shared
|
|
450
494
|
// state touched, no risk to the main checkout.
|
|
451
495
|
}
|
|
452
|
-
catch {
|
|
496
|
+
catch {
|
|
497
|
+
/* best-effort */
|
|
498
|
+
}
|
|
453
499
|
}
|
|
454
500
|
function readMetadata(worktreePath) {
|
|
455
501
|
try {
|
|
@@ -498,5 +544,13 @@ function listWorktrees(workDir) {
|
|
|
498
544
|
function findWorktreeByName(workDir, name) {
|
|
499
545
|
return listWorktrees(workDir).find((w) => w.name === name) ?? null;
|
|
500
546
|
}
|
|
501
|
-
exports._worktreeInternal = {
|
|
547
|
+
exports._worktreeInternal = {
|
|
548
|
+
isGitRepo,
|
|
549
|
+
safeName,
|
|
550
|
+
copyRecursive,
|
|
551
|
+
findWorktreeHook,
|
|
552
|
+
COPY_SKIP_DIRS,
|
|
553
|
+
WORKTREE_ROOT_DIRNAME,
|
|
554
|
+
metadataPath,
|
|
555
|
+
};
|
|
502
556
|
//# sourceMappingURL=worktree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktreeEnforcement.d.ts","sourceRoot":"","sources":["../../src/agent/worktreeEnforcement.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,WAAW,eAAe;IAC9B,MAAM,
|
|
1
|
+
{"version":3,"file":"worktreeEnforcement.d.ts","sourceRoot":"","sources":["../../src/agent/worktreeEnforcement.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,WAAW,eAAe;IAC9B,MAAM,EACF,uBAAuB,GACvB,2BAA2B,GAC3B,+BAA+B,GAC/B,yBAAyB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AA+BD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,OAAO,CAAC,EAAE,MAAM,GACf,eAAe,GAAG,IAAI,CAuBxB;AA2BD,iBAAS,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAIlF;AAED,iBAAS,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,eAAe,GAAG,IAAI,CAyC/F;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAcjE;AAED,eAAO,MAAM,4BAA4B;;;CAAyD,CAAC"}
|
|
@@ -69,16 +69,21 @@ exports.worktreeInstructions = worktreeInstructions;
|
|
|
69
69
|
const path = __importStar(require("path"));
|
|
70
70
|
const worktree_1 = require("./worktree");
|
|
71
71
|
const EDIT_TOOLS = new Set([
|
|
72
|
-
'write_file',
|
|
73
|
-
'
|
|
72
|
+
'write_file',
|
|
73
|
+
'write_docx',
|
|
74
|
+
'write_xlsx',
|
|
75
|
+
'write_pptx',
|
|
76
|
+
'edit_file',
|
|
77
|
+
'multi_edit',
|
|
78
|
+
'delete_file',
|
|
79
|
+
'notebook_edit',
|
|
74
80
|
]);
|
|
75
81
|
// move_file/copy_file carry two paths (source/destination — see loop.ts's
|
|
76
82
|
// lockPathsFor, which handles the identical shape for the same reason).
|
|
77
83
|
const DUAL_PATH_TOOLS = new Set(['move_file', 'copy_file']);
|
|
78
84
|
function pathsFromInput(tool, input) {
|
|
79
85
|
if (DUAL_PATH_TOOLS.has(tool)) {
|
|
80
|
-
return [input.source, input.destination, input.dest]
|
|
81
|
-
.filter((p) => typeof p === 'string' && p.length > 0);
|
|
86
|
+
return [input.source, input.destination, input.dest].filter((p) => typeof p === 'string' && p.length > 0);
|
|
82
87
|
}
|
|
83
88
|
if (typeof input.path === 'string' && input.path)
|
|
84
89
|
return [input.path];
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAA8B,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiErH,eAAO,MAAM,QAAQ,QAAmB,CAAC;AAIzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5D,OAAO,EAAE,CAAC,EAAE,EACZ,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GACtD,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAA8B,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiErH,eAAO,MAAM,QAAQ,QAAmB,CAAC;AAIzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5D,OAAO,EAAE,CAAC,EAAE,EACZ,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GACtD,CAAC,EAAE,CAaL;AA8BD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CA+B3D;AA4BD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,oFAAoF;IACpF,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACjG,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6IAA6I;IAC7I,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAQD;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAKD,8DAA8D;AAC9D,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AA6KD,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAC7B,OAAO,CAAC,OAAO,CAAC,CA03ClB;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9D;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYxD;AAeD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,GAAG,KAAK,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,wBAAwB,CAAC,CAqCnC;AAID,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CA0BlD;AAID;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAGlE;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3E;AAID;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC;IACnC,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CA2BnD;AAiBD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qFAAqF;IACrF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wFAAwF;IACxF,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBhG;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,SAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyBxE;AAID,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+B1E;AAID,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BhF;AAID,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAqB3D;AAsBD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQtD;AAmFD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAGnE;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,aAAa,CAAC,CAYzB;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IACL,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACA,OAAO,CAAC,aAAa,CAAC,CAYxB;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAI5E;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAGlF"}
|
package/dist/api/client.js
CHANGED
|
@@ -405,7 +405,7 @@ function sleep(ms) {
|
|
|
405
405
|
* the nested product (36) exists to bound pathological cases, not to be reached. */
|
|
406
406
|
const MAX_TOTAL_ATTEMPTS = (MAX_RETRIES + 1) * (MAX_RETRIES + 1);
|
|
407
407
|
async function streamChat(messages, options, onEvent) {
|
|
408
|
-
const { model, env, editorContext, nexrallMd, mode, effort, clientType, abortSignal, extraTools, agents, skills, allowRestartAfterRender, canWriteSharedMemory, hasOwnAgentStore, canSpawnSubAgents, canBrowseWeb, toolAllowlist } = options;
|
|
408
|
+
const { model, env, editorContext, nexrallMd, mode, effort, clientType, abortSignal, extraTools, agents, skills, allowRestartAfterRender, canWriteSharedMemory, hasOwnAgentStore, canSpawnSubAgents, canBrowseWeb, toolAllowlist, } = options;
|
|
409
409
|
// IDEMPOTENCY KEY for this logical turn, generated ONCE and reused by every retry
|
|
410
410
|
// below (that reuse is the entire point — a fresh id per attempt would be useless).
|
|
411
411
|
//
|
|
@@ -495,10 +495,30 @@ async function streamChat(messages, options, onEvent) {
|
|
|
495
495
|
const getChatBody = () => {
|
|
496
496
|
if (chatBody && chatBody.turnId === turnId)
|
|
497
497
|
return chatBody;
|
|
498
|
-
const json = JSON.stringify({
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
498
|
+
const json = JSON.stringify({
|
|
499
|
+
messages,
|
|
500
|
+
model,
|
|
501
|
+
env,
|
|
502
|
+
editorContext,
|
|
503
|
+
nexrallMd,
|
|
504
|
+
mode,
|
|
505
|
+
effort,
|
|
506
|
+
clientType,
|
|
507
|
+
extraTools,
|
|
508
|
+
agents,
|
|
509
|
+
skills,
|
|
510
|
+
turnId,
|
|
511
|
+
canWriteSharedMemory,
|
|
512
|
+
hasOwnAgentStore,
|
|
513
|
+
canSpawnSubAgents,
|
|
514
|
+
canBrowseWeb,
|
|
515
|
+
toolAllowlist,
|
|
516
|
+
...billingOverrideFields(),
|
|
517
|
+
});
|
|
518
|
+
chatBody =
|
|
519
|
+
gzipRequestsEnabled() && json.length >= GZIP_MIN_BYTES
|
|
520
|
+
? { data: (0, zlib_1.gzipSync)(json, { level: 5 }), gzip: true, turnId }
|
|
521
|
+
: { data: json, gzip: false, turnId };
|
|
502
522
|
return chatBody;
|
|
503
523
|
};
|
|
504
524
|
const buildFetchArgs = () => {
|
|
@@ -566,7 +586,7 @@ async function streamChat(messages, options, onEvent) {
|
|
|
566
586
|
// precisely backwards. Measuring only time spent RECONNECTING keeps the guarantee
|
|
567
587
|
// meaningful: "at most 5 minutes of retrying before we tell you it's broken".
|
|
568
588
|
let retryDeadline = 0;
|
|
569
|
-
const retryBudgetLeft = () => retryDeadline === 0 ? MAX_TOTAL_RETRY_MS : retryDeadline - Date.now();
|
|
589
|
+
const retryBudgetLeft = () => (retryDeadline === 0 ? MAX_TOTAL_RETRY_MS : retryDeadline - Date.now());
|
|
570
590
|
// Require a MEANINGFUL remainder, not just "> 0". With a bare positive check, 1 ms of
|
|
571
591
|
// budget was enough to launch a whole fresh attempt — which can then sit in
|
|
572
592
|
// FIRST_EVENT_TIMEOUT_MS (300 s) of prompt-processing wait, blowing past the very
|
|
@@ -770,13 +790,15 @@ async function streamChat(messages, options, onEvent) {
|
|
|
770
790
|
// node-fetch body is single-use — calling .text() again yields '' and the
|
|
771
791
|
// upstream-forbidden shape would never be recognised, turning a retryable
|
|
772
792
|
// blip into an instant terminal failure.
|
|
773
|
-
const bodyText = errorBodyOverride ?? await response.text().catch(() => '');
|
|
793
|
+
const bodyText = errorBodyOverride ?? (await response.text().catch(() => ''));
|
|
774
794
|
let isUpstreamForbidden = false;
|
|
775
795
|
try {
|
|
776
796
|
const parsed = JSON.parse(bodyText);
|
|
777
797
|
isUpstreamForbidden = parsed?.error?.type === 'forbidden';
|
|
778
798
|
}
|
|
779
|
-
catch {
|
|
799
|
+
catch {
|
|
800
|
+
/* not JSON — not this shape, fall through as terminal below */
|
|
801
|
+
}
|
|
780
802
|
if (isUpstreamForbidden) {
|
|
781
803
|
if (attempt < FORBIDDEN_RETRY_LIMIT && canRetry()) {
|
|
782
804
|
reportRetry('Upstream rejected the request — retrying');
|
|
@@ -822,7 +844,7 @@ async function streamChat(messages, options, onEvent) {
|
|
|
822
844
|
if (resuming && response.status >= 400 && response.status < 500) {
|
|
823
845
|
// May already have been read by the token-expiry check above (401/403);
|
|
824
846
|
// node-fetch bodies are single-use, so reuse it rather than reading ''.
|
|
825
|
-
const body = errorBodyOverride ?? await response.text().catch(() => '');
|
|
847
|
+
const body = errorBodyOverride ?? (await response.text().catch(() => ''));
|
|
826
848
|
if (response.status === 410 || response.status === 404 || bodySaysNotResumable(body)) {
|
|
827
849
|
const canRestart = await prepareRestart('Connection lost too long to resume');
|
|
828
850
|
if (!canRestart) {
|
|
@@ -862,7 +884,9 @@ async function streamChat(messages, options, onEvent) {
|
|
|
862
884
|
try {
|
|
863
885
|
inFlight = JSON.parse(body)?.turnInFlight === true;
|
|
864
886
|
}
|
|
865
|
-
catch {
|
|
887
|
+
catch {
|
|
888
|
+
/* treat as terminal */
|
|
889
|
+
}
|
|
866
890
|
// A wait is NOT a failed attempt, so it must not consume the network-error
|
|
867
891
|
// budget: a real coding turn runs for minutes, and spending `MAX_RETRIES` on
|
|
868
892
|
// fixed short sleeps burned the whole allowance in ~10 s and hard-failed while
|
|
@@ -919,7 +943,7 @@ async function streamChat(messages, options, onEvent) {
|
|
|
919
943
|
if (!response)
|
|
920
944
|
throw lastErr ?? new Error('Request failed after max retries');
|
|
921
945
|
if (!response.ok) {
|
|
922
|
-
const errText = errorBodyOverride ?? await response.text();
|
|
946
|
+
const errText = errorBodyOverride ?? (await response.text());
|
|
923
947
|
let errMsg = `API error ${response.status}`;
|
|
924
948
|
let balance;
|
|
925
949
|
// code/remaining/teamId are the team-billing fields (migration 139). The
|
|
@@ -1340,7 +1364,9 @@ async function streamChat(messages, options, onEvent) {
|
|
|
1340
1364
|
usage: {
|
|
1341
1365
|
input_tokens: evt.input_tokens,
|
|
1342
1366
|
output_tokens: evt.output_tokens,
|
|
1343
|
-
cache_creation_input_tokens: typeof evt.cache_creation_input_tokens === 'number'
|
|
1367
|
+
cache_creation_input_tokens: typeof evt.cache_creation_input_tokens === 'number'
|
|
1368
|
+
? evt.cache_creation_input_tokens
|
|
1369
|
+
: undefined,
|
|
1344
1370
|
cache_read_input_tokens: typeof evt.cache_read_input_tokens === 'number' ? evt.cache_read_input_tokens : undefined,
|
|
1345
1371
|
},
|
|
1346
1372
|
});
|
|
@@ -1447,8 +1473,11 @@ async function streamChat(messages, options, onEvent) {
|
|
|
1447
1473
|
break;
|
|
1448
1474
|
}
|
|
1449
1475
|
case 'error': {
|
|
1450
|
-
const message = typeof evt.message === 'string'
|
|
1451
|
-
|
|
1476
|
+
const message = typeof evt.message === 'string'
|
|
1477
|
+
? evt.message
|
|
1478
|
+
: typeof evt.error === 'string'
|
|
1479
|
+
? evt.error
|
|
1480
|
+
: 'Unknown SSE error';
|
|
1452
1481
|
// The GET /chat/resume tail loop sends this when the turn's Redis frame
|
|
1453
1482
|
// buffer developed a gap (trimmed window, a swallowed flush error, or the
|
|
1454
1483
|
// owning pod died) or the turn is simply gone — see routes/code.js. Unlike
|
|
@@ -1495,7 +1524,8 @@ async function streamChat(messages, options, onEvent) {
|
|
|
1495
1524
|
stream.destroy?.();
|
|
1496
1525
|
reject(Object.assign(tagTransient(new Error(message)), { forceRestart: true }));
|
|
1497
1526
|
}
|
|
1498
|
-
else if ((serverSaysRetryable || isRetryableStreamMsg(message)) &&
|
|
1527
|
+
else if ((serverSaysRetryable || isRetryableStreamMsg(message)) &&
|
|
1528
|
+
(!emittedToCaller || allowRestartAfterRender)) {
|
|
1499
1529
|
clearInterval(heartbeatWatchdog);
|
|
1500
1530
|
stream.destroy?.();
|
|
1501
1531
|
reject(tagTransient(new Error(message)));
|
|
@@ -1634,7 +1664,10 @@ async function streamChat(messages, options, onEvent) {
|
|
|
1634
1664
|
if (e.forceRestart) {
|
|
1635
1665
|
const canRestart = await prepareRestart(err.message || 'Could not resume — restarting this turn');
|
|
1636
1666
|
if (!canRestart) {
|
|
1637
|
-
|
|
1667
|
+
// Object.assign keeps the original failure attached — the two-arg
|
|
1668
|
+
// `new Error(msg, { cause })` form needs ES2022 lib types and this
|
|
1669
|
+
// package compiles against ES2020. Diagnostics depend on this cause.
|
|
1670
|
+
throw Object.assign(new Error('Connection lost and this turn could no longer be resumed. Send your message again.'), { cause: err });
|
|
1638
1671
|
}
|
|
1639
1672
|
reportRetry('Could not resume — restarting this turn');
|
|
1640
1673
|
await sleepWithinBudget(backoffMs(sAttempt));
|
|
@@ -1753,7 +1786,7 @@ async function describeAttachment(kind, data, mediaType, name) {
|
|
|
1753
1786
|
// expired token during `/image` should not surface as a confusing raw 401.
|
|
1754
1787
|
if (response.status === 401 || response.status === 403) {
|
|
1755
1788
|
const body = await response.text().catch(() => '');
|
|
1756
|
-
if (isExpiredTokenResponse(response.status, body) && await refreshAccessToken()) {
|
|
1789
|
+
if (isExpiredTokenResponse(response.status, body) && (await refreshAccessToken())) {
|
|
1757
1790
|
response = await fetchOnce();
|
|
1758
1791
|
}
|
|
1759
1792
|
else {
|
|
@@ -1767,7 +1800,9 @@ async function describeAttachment(kind, data, mediaType, name) {
|
|
|
1767
1800
|
if (body?.error)
|
|
1768
1801
|
message = body.error;
|
|
1769
1802
|
}
|
|
1770
|
-
catch {
|
|
1803
|
+
catch {
|
|
1804
|
+
/* non-JSON error body — keep the generic message */
|
|
1805
|
+
}
|
|
1771
1806
|
throw new Error(message);
|
|
1772
1807
|
}
|
|
1773
1808
|
const json = (await response.json());
|
|
@@ -1786,7 +1821,7 @@ async function getBalance() {
|
|
|
1786
1821
|
// path quietly recovers is just confusing.
|
|
1787
1822
|
if (response.status === 401 || response.status === 403) {
|
|
1788
1823
|
const body = await response.text().catch(() => '');
|
|
1789
|
-
if (isExpiredTokenResponse(response.status, body) && await refreshAccessToken()) {
|
|
1824
|
+
if (isExpiredTokenResponse(response.status, body) && (await refreshAccessToken())) {
|
|
1790
1825
|
response = await fetchOnce();
|
|
1791
1826
|
}
|
|
1792
1827
|
else {
|
|
@@ -1836,7 +1871,9 @@ async function setBillingTarget(teamId) {
|
|
|
1836
1871
|
if (parsed.error)
|
|
1837
1872
|
message = parsed.error;
|
|
1838
1873
|
}
|
|
1839
|
-
catch {
|
|
1874
|
+
catch {
|
|
1875
|
+
/* non-JSON body — keep the status message */
|
|
1876
|
+
}
|
|
1840
1877
|
throw new Error(message);
|
|
1841
1878
|
}
|
|
1842
1879
|
}
|
|
@@ -1855,7 +1892,7 @@ async function getOrgs() {
|
|
|
1855
1892
|
// frequently the first call the panel makes.
|
|
1856
1893
|
if (response.status === 401 || response.status === 403) {
|
|
1857
1894
|
const body = await response.text().catch(() => '');
|
|
1858
|
-
if (isExpiredTokenResponse(response.status, body) && await refreshAccessToken()) {
|
|
1895
|
+
if (isExpiredTokenResponse(response.status, body) && (await refreshAccessToken())) {
|
|
1859
1896
|
response = await fetchOnce();
|
|
1860
1897
|
}
|
|
1861
1898
|
else {
|
|
@@ -1877,7 +1914,7 @@ async function getCodeModels() {
|
|
|
1877
1914
|
let response = await fetchOnce();
|
|
1878
1915
|
if (response.status === 401 || response.status === 403) {
|
|
1879
1916
|
const body = await response.text().catch(() => '');
|
|
1880
|
-
if (isExpiredTokenResponse(response.status, body) && await refreshAccessToken()) {
|
|
1917
|
+
if (isExpiredTokenResponse(response.status, body) && (await refreshAccessToken())) {
|
|
1881
1918
|
response = await fetchOnce();
|
|
1882
1919
|
}
|
|
1883
1920
|
else {
|
|
@@ -1904,7 +1941,7 @@ async function getUsageDaily(days = 30) {
|
|
|
1904
1941
|
let response = await fetchOnce();
|
|
1905
1942
|
if (response.status === 401 || response.status === 403) {
|
|
1906
1943
|
const body = await response.text().catch(() => '');
|
|
1907
|
-
if (isExpiredTokenResponse(response.status, body) && await refreshAccessToken()) {
|
|
1944
|
+
if (isExpiredTokenResponse(response.status, body) && (await refreshAccessToken())) {
|
|
1908
1945
|
response = await fetchOnce();
|
|
1909
1946
|
}
|
|
1910
1947
|
else {
|
|
@@ -1983,7 +2020,7 @@ async function getUserProfile() {
|
|
|
1983
2020
|
let response = await fetchOnce();
|
|
1984
2021
|
if (response.status === 401 || response.status === 403) {
|
|
1985
2022
|
const body = await response.text().catch(() => '');
|
|
1986
|
-
if (isExpiredTokenResponse(response.status, body) && await refreshAccessToken()) {
|
|
2023
|
+
if (isExpiredTokenResponse(response.status, body) && (await refreshAccessToken())) {
|
|
1987
2024
|
response = await fetchOnce();
|
|
1988
2025
|
}
|
|
1989
2026
|
else {
|
|
@@ -2070,7 +2107,9 @@ function apiErrorMessage(status, text) {
|
|
|
2070
2107
|
if (typeof j.error === 'string' && j.error)
|
|
2071
2108
|
return j.error;
|
|
2072
2109
|
}
|
|
2073
|
-
catch {
|
|
2110
|
+
catch {
|
|
2111
|
+
/* not JSON — fall through to the raw text */
|
|
2112
|
+
}
|
|
2074
2113
|
return `API error ${status}${text ? `: ${text}` : ''}`;
|
|
2075
2114
|
}
|
|
2076
2115
|
async function scheduleRequest(method, path, body) {
|
|
@@ -2084,7 +2123,7 @@ async function scheduleRequest(method, path, body) {
|
|
|
2084
2123
|
// first call of a session is the common case, not an error to surface.
|
|
2085
2124
|
if (response.status === 401 || response.status === 403) {
|
|
2086
2125
|
const text = await response.text().catch(() => '');
|
|
2087
|
-
if (isExpiredTokenResponse(response.status, text) && await refreshAccessToken()) {
|
|
2126
|
+
if (isExpiredTokenResponse(response.status, text) && (await refreshAccessToken())) {
|
|
2088
2127
|
response = await fetchOnce();
|
|
2089
2128
|
}
|
|
2090
2129
|
else {
|
|
@@ -2098,9 +2137,7 @@ async function scheduleRequest(method, path, body) {
|
|
|
2098
2137
|
}
|
|
2099
2138
|
async function listCloudSchedules() {
|
|
2100
2139
|
const json = (await scheduleRequest('GET', '/schedules'));
|
|
2101
|
-
return Array.isArray(json?.schedules)
|
|
2102
|
-
? json.schedules.map((r) => scheduleRow(r))
|
|
2103
|
-
: [];
|
|
2140
|
+
return Array.isArray(json?.schedules) ? json.schedules.map((r) => scheduleRow(r)) : [];
|
|
2104
2141
|
}
|
|
2105
2142
|
async function createCloudSchedule(input) {
|
|
2106
2143
|
const task = String(input.task ?? '').trim();
|
|
@@ -2157,8 +2194,6 @@ async function runCloudScheduleNow(id) {
|
|
|
2157
2194
|
}
|
|
2158
2195
|
async function getCloudScheduleRuns(id) {
|
|
2159
2196
|
const json = (await scheduleRequest('GET', `/schedules/${scheduleId(id)}/runs`));
|
|
2160
|
-
return Array.isArray(json?.runs)
|
|
2161
|
-
? json.runs.map((r) => scheduleRunRow(r))
|
|
2162
|
-
: [];
|
|
2197
|
+
return Array.isArray(json?.runs) ? json.runs.map((r) => scheduleRunRow(r)) : [];
|
|
2163
2198
|
}
|
|
2164
2199
|
//# sourceMappingURL=client.js.map
|
package/dist/auth/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAiB3C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGjD;AAED,wBAAgB,QAAQ,IAAI,UAAU,GAAG,IAAI,CAwB5C;AAED,wBAAgB,SAAS,IAAI,IAAI,CAQhC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAGxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAM/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAiB3C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGjD;AAED,wBAAgB,QAAQ,IAAI,UAAU,GAAG,IAAI,CAwB5C;AAED,wBAAgB,SAAS,IAAI,IAAI,CAQhC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAGxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAM/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAwBvE;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAiBlE"}
|
package/dist/auth/index.js
CHANGED
|
@@ -140,7 +140,9 @@ function updateTokens(token, refreshToken) {
|
|
|
140
140
|
existing = parsed;
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
-
catch {
|
|
143
|
+
catch {
|
|
144
|
+
/* corrupt or unreadable — start clean rather than refuse to save */
|
|
145
|
+
}
|
|
144
146
|
ensureConfigDir();
|
|
145
147
|
const next = {
|
|
146
148
|
...existing,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/checkpoint/manager.ts"],"names":[],"mappings":"AA+CA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/checkpoint/manager.ts"],"names":[],"mappings":"AA+CA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AASD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASlE;AA4BD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,8FAA8F;IAC9F,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,sGAAsG;IACtG,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kFAAkF;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,6FAA6F;IAC7F,SAAS,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AA6BD,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;;;OAIG;gBAEgB,OAAO,EAAE,MAAM,EAChC,KAAK,CAAC,EAAE,MAAM;IAchB,OAAO,CAAC,OAAO;IAIf;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAcpD;;;;;OAKG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA8BxE;;;;;;;OAOG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQxC,OAAO,CAAC,iBAAiB;IAiBzB,0FAA0F;IAC1F,UAAU,IAAI,IAAI;IAWlB,IAAI,IAAI,iBAAiB,EAAE;IAY3B,cAAc,IAAI,OAAO;IAIzB;;;;;OAKG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IA0BnD,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,YAAY;CAsCrB"}
|
|
@@ -92,7 +92,10 @@ function isPotentiallyMutatingBash(command) {
|
|
|
92
92
|
if (!cmd)
|
|
93
93
|
return false;
|
|
94
94
|
// Multi-line or chained commands: assume mutating unless every segment is read-only.
|
|
95
|
-
const segments = cmd
|
|
95
|
+
const segments = cmd
|
|
96
|
+
.split(/\n|&&|\|\||;/)
|
|
97
|
+
.map((s) => s.trim())
|
|
98
|
+
.filter(Boolean);
|
|
96
99
|
return segments.some((seg) => !READONLY_BASH.test(seg));
|
|
97
100
|
}
|
|
98
101
|
function str(v) {
|
|
@@ -180,7 +183,7 @@ class CheckpointManager {
|
|
|
180
183
|
const abs = this.resolve(rel);
|
|
181
184
|
if (this.current.snapshots.has(abs))
|
|
182
185
|
continue;
|
|
183
|
-
let existed
|
|
186
|
+
let existed;
|
|
184
187
|
let content = null;
|
|
185
188
|
try {
|
|
186
189
|
const st = fs.statSync(abs);
|
|
@@ -303,7 +306,9 @@ class CheckpointManager {
|
|
|
303
306
|
try {
|
|
304
307
|
fs.rmdirSync(snap.absPath);
|
|
305
308
|
}
|
|
306
|
-
catch {
|
|
309
|
+
catch {
|
|
310
|
+
/* non-empty dir — leave it */
|
|
311
|
+
}
|
|
307
312
|
}
|
|
308
313
|
}
|
|
309
314
|
}
|
|
@@ -343,7 +348,9 @@ class CheckpointManager {
|
|
|
343
348
|
fs.writeFileSync(tmp, JSON.stringify(persisted));
|
|
344
349
|
fs.renameSync(tmp, this.turnFile(turn.id));
|
|
345
350
|
}
|
|
346
|
-
catch {
|
|
351
|
+
catch {
|
|
352
|
+
/* best-effort */
|
|
353
|
+
}
|
|
347
354
|
}
|
|
348
355
|
persistIndex() {
|
|
349
356
|
try {
|
|
@@ -358,13 +365,17 @@ class CheckpointManager {
|
|
|
358
365
|
fs.writeFileSync(tmp, JSON.stringify(index));
|
|
359
366
|
fs.renameSync(tmp, path.join(this.storeDir, 'index.json'));
|
|
360
367
|
}
|
|
361
|
-
catch {
|
|
368
|
+
catch {
|
|
369
|
+
/* best-effort */
|
|
370
|
+
}
|
|
362
371
|
}
|
|
363
372
|
deleteTurnFile(id) {
|
|
364
373
|
try {
|
|
365
374
|
fs.unlinkSync(this.turnFile(id));
|
|
366
375
|
}
|
|
367
|
-
catch {
|
|
376
|
+
catch {
|
|
377
|
+
/* already gone */
|
|
378
|
+
}
|
|
368
379
|
}
|
|
369
380
|
prune() {
|
|
370
381
|
while (this.turns.length > MAX_PERSISTED_TURNS) {
|
|
@@ -401,14 +412,18 @@ class CheckpointManager {
|
|
|
401
412
|
snapshots,
|
|
402
413
|
});
|
|
403
414
|
}
|
|
404
|
-
catch {
|
|
415
|
+
catch {
|
|
416
|
+
/* skip corrupt turn file */
|
|
417
|
+
}
|
|
405
418
|
}
|
|
406
419
|
// Guard against a stale index: nextId must exceed every loaded id.
|
|
407
420
|
const maxId = this.turns.reduce((m, t) => Math.max(m, t.id), 0);
|
|
408
421
|
if (this.nextId <= maxId)
|
|
409
422
|
this.nextId = maxId + 1;
|
|
410
423
|
}
|
|
411
|
-
catch {
|
|
424
|
+
catch {
|
|
425
|
+
/* no persisted state — fresh start */
|
|
426
|
+
}
|
|
412
427
|
}
|
|
413
428
|
}
|
|
414
429
|
exports.CheckpointManager = CheckpointManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/commands/loader.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;CACrD;AAsED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CASjE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG7F;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/commands/loader.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;CACrD;AAsED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CASjE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG7F;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA4CnF;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3F"}
|
package/dist/commands/loader.js
CHANGED
|
@@ -144,7 +144,12 @@ function expandBody(body, argString, workDir) {
|
|
|
144
144
|
// !`shell command` → captured stdout
|
|
145
145
|
out = out.replace(/!`([^`]+)`/g, (_m, c) => {
|
|
146
146
|
try {
|
|
147
|
-
const stdout = (0, child_process_1.execSync)(c, {
|
|
147
|
+
const stdout = (0, child_process_1.execSync)(c, {
|
|
148
|
+
cwd: workDir,
|
|
149
|
+
encoding: 'utf-8',
|
|
150
|
+
timeout: 15000,
|
|
151
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
152
|
+
});
|
|
148
153
|
return stdout.trim();
|
|
149
154
|
}
|
|
150
155
|
catch (err) {
|
package/dist/index.d.ts
CHANGED
|
@@ -15,8 +15,10 @@ export * from './agent/claimEvidence';
|
|
|
15
15
|
export * from './agent/audit';
|
|
16
16
|
export * from './agent/memory';
|
|
17
17
|
export * from './agent/skills';
|
|
18
|
+
export * from './agent/nestedInstructions';
|
|
18
19
|
export * from './mcp/client';
|
|
19
20
|
export * from './mcp/httpClient';
|
|
21
|
+
export * from './mcp/instructions';
|
|
20
22
|
export * from './mcp/manager';
|
|
21
23
|
export * from './mcp/server';
|
|
22
24
|
export * from './mcp/stats';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC"}
|