@nexrall/code-core 1.4.75 → 1.4.77
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/askOnce.d.ts +10 -0
- package/dist/agent/askOnce.d.ts.map +1 -1
- package/dist/agent/askOnce.js +10 -2
- package/dist/agent/goal.d.ts +55 -0
- package/dist/agent/goal.d.ts.map +1 -0
- package/dist/agent/goal.js +120 -0
- package/dist/agent/handoffBrief.d.ts +82 -0
- package/dist/agent/handoffBrief.d.ts.map +1 -0
- package/dist/agent/handoffBrief.js +121 -0
- package/dist/agent/modelCatalogue.d.ts +23 -0
- package/dist/agent/modelCatalogue.d.ts.map +1 -1
- package/dist/agent/modelCatalogue.js +28 -0
- package/dist/agent/outputStyles.d.ts +27 -0
- package/dist/agent/outputStyles.d.ts.map +1 -0
- package/dist/agent/outputStyles.js +174 -0
- package/dist/agent/planMode.d.ts.map +1 -1
- package/dist/agent/planMode.js +16 -3
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +7 -0
- package/dist/api/billingLines.d.ts +11 -0
- package/dist/api/billingLines.d.ts.map +1 -0
- package/dist/api/billingLines.js +56 -0
- package/dist/api/client.d.ts +2 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/scheduleLines.d.ts +53 -0
- package/dist/api/scheduleLines.d.ts.map +1 -0
- package/dist/api/scheduleLines.js +150 -0
- package/dist/context/contextFiles.d.ts +81 -0
- package/dist/context/contextFiles.d.ts.map +1 -0
- package/dist/context/contextFiles.js +310 -0
- package/dist/diff/collect.d.ts +25 -0
- package/dist/diff/collect.d.ts.map +1 -0
- package/dist/diff/collect.js +169 -0
- package/dist/diff/diffView.d.ts +57 -0
- package/dist/diff/diffView.d.ts.map +1 -0
- package/dist/diff/diffView.js +231 -0
- package/dist/diff/reviewQueue.d.ts +53 -0
- package/dist/diff/reviewQueue.d.ts.map +1 -0
- package/dist/diff/reviewQueue.js +349 -0
- package/dist/events/recap.d.ts +54 -0
- package/dist/events/recap.d.ts.map +1 -0
- package/dist/events/recap.js +161 -0
- package/dist/events/sessionEvents.d.ts +54 -0
- package/dist/events/sessionEvents.d.ts.map +1 -0
- package/dist/events/sessionEvents.js +324 -0
- package/dist/events/sessionStats.d.ts +89 -0
- package/dist/events/sessionStats.d.ts.map +1 -0
- package/dist/events/sessionStats.js +264 -0
- package/dist/import/claudeImport.d.ts +44 -0
- package/dist/import/claudeImport.d.ts.map +1 -0
- package/dist/import/claudeImport.js +337 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -0
- package/dist/permissions/autoMode.d.ts +89 -0
- package/dist/permissions/autoMode.d.ts.map +1 -0
- package/dist/permissions/autoMode.js +346 -0
- package/dist/permissions/rules.d.ts +6 -0
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +33 -0
- package/dist/project/projectCommands.d.ts +33 -0
- package/dist/project/projectCommands.d.ts.map +1 -0
- package/dist/project/projectCommands.js +246 -0
- package/dist/search/conversationTurns.d.ts +53 -0
- package/dist/search/conversationTurns.d.ts.map +1 -0
- package/dist/search/conversationTurns.js +170 -0
- package/dist/search/globalSearch.d.ts +144 -0
- package/dist/search/globalSearch.d.ts.map +1 -0
- package/dist/search/globalSearch.js +350 -0
- package/dist/share/sessionChannel.d.ts +136 -0
- package/dist/share/sessionChannel.d.ts.map +1 -0
- package/dist/share/sessionChannel.js +373 -0
- package/dist/share/sessionShare.d.ts +104 -0
- package/dist/share/sessionShare.d.ts.map +1 -0
- package/dist/share/sessionShare.js +336 -0
- package/dist/ui/configCmd.d.ts +48 -0
- package/dist/ui/configCmd.d.ts.map +1 -0
- package/dist/ui/configCmd.js +146 -0
- package/dist/ui/deployPanel.d.ts +91 -0
- package/dist/ui/deployPanel.d.ts.map +1 -0
- package/dist/ui/deployPanel.js +442 -0
- package/dist/ui/mergeAssistant.d.ts +120 -0
- package/dist/ui/mergeAssistant.d.ts.map +1 -0
- package/dist/ui/mergeAssistant.js +391 -0
- package/dist/ui/notify.d.ts +114 -0
- package/dist/ui/notify.d.ts.map +1 -0
- package/dist/ui/notify.js +235 -0
- package/dist/ui/promptSuggest.d.ts +56 -0
- package/dist/ui/promptSuggest.d.ts.map +1 -0
- package/dist/ui/promptSuggest.js +160 -0
- package/dist/ui/taskGraph.d.ts +44 -0
- package/dist/ui/taskGraph.d.ts.map +1 -0
- package/dist/ui/taskGraph.js +289 -0
- package/dist/util/addDir.d.ts +31 -0
- package/dist/util/addDir.d.ts.map +1 -0
- package/dist/util/addDir.js +124 -0
- package/dist/util/batch.d.ts +16 -0
- package/dist/util/batch.d.ts.map +1 -0
- package/dist/util/batch.js +92 -0
- package/dist/util/cellWidth.d.ts +12 -0
- package/dist/util/cellWidth.d.ts.map +1 -0
- package/dist/util/cellWidth.js +161 -0
- package/dist/util/duration.d.ts +8 -0
- package/dist/util/duration.d.ts.map +1 -0
- package/dist/util/duration.js +50 -0
- package/dist/util/loopJobs.d.ts +67 -0
- package/dist/util/loopJobs.d.ts.map +1 -0
- package/dist/util/loopJobs.js +169 -0
- package/dist/util/settingsFile.d.ts +14 -0
- package/dist/util/settingsFile.d.ts.map +1 -0
- package/dist/util/settingsFile.js +99 -0
- package/dist/util/toolLabel.d.ts +2 -0
- package/dist/util/toolLabel.d.ts.map +1 -0
- package/dist/util/toolLabel.js +17 -0
- package/dist/verify/failureTimeline.d.ts +100 -0
- package/dist/verify/failureTimeline.d.ts.map +1 -0
- package/dist/verify/failureTimeline.js +253 -0
- package/dist/verify/verification.d.ts +75 -0
- package/dist/verify/verification.d.ts.map +1 -0
- package/dist/verify/verification.js +315 -0
- package/package.json +5 -4
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Lives in core (moved from the CLI's commands/importClaude.ts, 2026-10-04) so
|
|
3
|
+
// the VS Code panel runs the same plan/apply for /import; the CLI module is a
|
|
4
|
+
// re-export shim.
|
|
5
|
+
// /import — bring a Claude Code setup (`.claude/` and CLAUDE.md) into nex.
|
|
6
|
+
//
|
|
7
|
+
// What carries over unchanged, because nex reads the same shapes:
|
|
8
|
+
// .claude/commands/**/*.md → .nexrall/commands/ (slash commands)
|
|
9
|
+
// .claude/agents/*.md → .nexrall/agents/ (sub-agents; Claude tool names are accepted)
|
|
10
|
+
// .claude/skills/<n>/… → .nexrall/skills/<n>/… (the whole directory: scripts, references)
|
|
11
|
+
// CLAUDE.md → nexrall.md (the project brief)
|
|
12
|
+
// What is merged into settings.json (only keys that exist in both products):
|
|
13
|
+
// permissions.allow/deny/ask, hooks (nested and short hook shapes are both read by nex)
|
|
14
|
+
// What is reported but NOT guessed at: everything else in settings.json (env, model, statusLine,
|
|
15
|
+
// apiKeyHelper, …) — a setting that quietly means something different is worse than a missing one.
|
|
16
|
+
//
|
|
17
|
+
// Rules this file never breaks:
|
|
18
|
+
// • nothing existing is overwritten — a clash is reported as "skipped: exists";
|
|
19
|
+
// • the default is a DRY RUN: it lists what it would do and writes nothing until `--apply`;
|
|
20
|
+
// • it only reads from the source and only writes under .nexrall/ or nexrall.md.
|
|
21
|
+
//
|
|
22
|
+
// Pure of the REPL: takes directories in, returns a plan, applies the plan. chat.ts only prints.
|
|
23
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
26
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
27
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
28
|
+
}
|
|
29
|
+
Object.defineProperty(o, k2, desc);
|
|
30
|
+
}) : (function(o, m, k, k2) {
|
|
31
|
+
if (k2 === undefined) k2 = k;
|
|
32
|
+
o[k2] = m[k];
|
|
33
|
+
}));
|
|
34
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
35
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
36
|
+
}) : function(o, v) {
|
|
37
|
+
o["default"] = v;
|
|
38
|
+
});
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.planImport = planImport;
|
|
58
|
+
exports.applyImport = applyImport;
|
|
59
|
+
exports.formatPlan = formatPlan;
|
|
60
|
+
const fs = __importStar(require("fs"));
|
|
61
|
+
const path = __importStar(require("path"));
|
|
62
|
+
const isFile = (p) => {
|
|
63
|
+
try {
|
|
64
|
+
return fs.statSync(p).isFile();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const isDir = (p) => {
|
|
71
|
+
try {
|
|
72
|
+
return fs.statSync(p).isDirectory();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
/** Every *.md under dir, as paths relative to dir (commands may be nested: `git/commit.md`). */
|
|
79
|
+
function listMarkdown(dir) {
|
|
80
|
+
const out = [];
|
|
81
|
+
const walk = (d, rel) => {
|
|
82
|
+
let entries;
|
|
83
|
+
try {
|
|
84
|
+
entries = fs.readdirSync(d, { withFileTypes: true });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
90
|
+
if (e.name.startsWith('.'))
|
|
91
|
+
continue;
|
|
92
|
+
const r = rel ? `${rel}/${e.name}` : e.name;
|
|
93
|
+
if (e.isDirectory())
|
|
94
|
+
walk(path.join(d, e.name), r);
|
|
95
|
+
else if (e.isFile() && /\.md$/i.test(e.name))
|
|
96
|
+
out.push(r);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
walk(dir, '');
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
function readJson(file) {
|
|
103
|
+
if (!isFile(file))
|
|
104
|
+
return null;
|
|
105
|
+
try {
|
|
106
|
+
const v = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
107
|
+
if (v && typeof v === 'object' && !Array.isArray(v))
|
|
108
|
+
return { ok: true, value: v };
|
|
109
|
+
return { ok: false, error: 'not a JSON object' };
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
return { ok: false, error: e.message };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** The keys of a Claude settings.json that carry over; everything else is only reported. */
|
|
116
|
+
const IMPORTED_SETTING_KEYS = new Set(['permissions', 'hooks']);
|
|
117
|
+
function planImport(r) {
|
|
118
|
+
const items = [];
|
|
119
|
+
const src = path.join(r.sourceBase, '.claude');
|
|
120
|
+
const dst = path.join(r.destBase, '.nexrall');
|
|
121
|
+
// commands
|
|
122
|
+
for (const rel of listMarkdown(path.join(src, 'commands'))) {
|
|
123
|
+
const to = path.join(dst, 'commands', ...rel.split('/'));
|
|
124
|
+
items.push({
|
|
125
|
+
kind: 'command',
|
|
126
|
+
from: path.join(src, 'commands', ...rel.split('/')),
|
|
127
|
+
to,
|
|
128
|
+
status: fs.existsSync(to) ? 'skip-exists' : 'copy',
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// agents (flat)
|
|
132
|
+
for (const rel of listMarkdown(path.join(src, 'agents')).filter((x) => !x.includes('/'))) {
|
|
133
|
+
const to = path.join(dst, 'agents', rel);
|
|
134
|
+
items.push({
|
|
135
|
+
kind: 'agent',
|
|
136
|
+
from: path.join(src, 'agents', rel),
|
|
137
|
+
to,
|
|
138
|
+
status: fs.existsSync(to) ? 'skip-exists' : 'copy',
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// skills: one directory each, only if it has a SKILL.md
|
|
142
|
+
const skillsDir = path.join(src, 'skills');
|
|
143
|
+
if (isDir(skillsDir)) {
|
|
144
|
+
for (const name of fs.readdirSync(skillsDir).sort()) {
|
|
145
|
+
const d = path.join(skillsDir, name);
|
|
146
|
+
if (name.startsWith('.') || !isDir(d) || !isFile(path.join(d, 'SKILL.md')))
|
|
147
|
+
continue;
|
|
148
|
+
const to = path.join(dst, 'skills', name);
|
|
149
|
+
items.push({ kind: 'skill', from: d, to, status: fs.existsSync(to) ? 'skip-exists' : 'copy' });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// brief (project scope only)
|
|
153
|
+
if (r.scope === 'project') {
|
|
154
|
+
const claudeMd = path.join(r.sourceBase, 'CLAUDE.md');
|
|
155
|
+
if (isFile(claudeMd)) {
|
|
156
|
+
const to = path.join(r.destBase, 'nexrall.md');
|
|
157
|
+
const anyBrief = ['nexrall.md', 'NEXRALL.md', path.join('.nexrall', 'instructions.md')].some((c) => isFile(path.join(r.destBase, c)));
|
|
158
|
+
items.push({ kind: 'brief', from: claudeMd, to, status: anyBrief ? 'skip-exists' : 'copy' });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// settings: permissions + hooks
|
|
162
|
+
const ignored = [];
|
|
163
|
+
const settingsFiles = r.scope === 'project' ? ['settings.json'] : ['settings.json'];
|
|
164
|
+
for (const f of settingsFiles) {
|
|
165
|
+
const j = readJson(path.join(src, f));
|
|
166
|
+
if (!j)
|
|
167
|
+
continue;
|
|
168
|
+
if (!j.ok) {
|
|
169
|
+
items.push({
|
|
170
|
+
kind: 'permissions',
|
|
171
|
+
from: path.join(src, f),
|
|
172
|
+
to: path.join(dst, 'settings.json'),
|
|
173
|
+
status: 'skip-empty',
|
|
174
|
+
note: `unreadable: ${j.error}`,
|
|
175
|
+
});
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const perms = j.value.permissions;
|
|
179
|
+
if (perms && typeof perms === 'object') {
|
|
180
|
+
const p = perms;
|
|
181
|
+
const n = ['allow', 'deny', 'ask'].reduce((a, k) => a + (Array.isArray(p[k]) ? p[k].length : 0), 0);
|
|
182
|
+
if (n > 0)
|
|
183
|
+
items.push({
|
|
184
|
+
kind: 'permissions',
|
|
185
|
+
from: path.join(src, f),
|
|
186
|
+
to: path.join(dst, 'settings.json'),
|
|
187
|
+
status: 'merge',
|
|
188
|
+
note: `${n} permission rule${n === 1 ? '' : 's'}`,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
const hooks = j.value.hooks;
|
|
192
|
+
if (hooks && typeof hooks === 'object' && Object.keys(hooks).length > 0) {
|
|
193
|
+
items.push({
|
|
194
|
+
kind: 'hooks',
|
|
195
|
+
from: path.join(src, f),
|
|
196
|
+
to: path.join(dst, 'settings.json'),
|
|
197
|
+
status: 'merge',
|
|
198
|
+
note: `${Object.keys(hooks).length} hook event${Object.keys(hooks).length === 1 ? '' : 's'}`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
for (const k of Object.keys(j.value))
|
|
202
|
+
if (!IMPORTED_SETTING_KEYS.has(k) && !ignored.includes(k))
|
|
203
|
+
ignored.push(k);
|
|
204
|
+
}
|
|
205
|
+
return { items, ignoredSettings: ignored.sort(), empty: items.length === 0 && ignored.length === 0 };
|
|
206
|
+
}
|
|
207
|
+
function copyDir(from, to) {
|
|
208
|
+
fs.mkdirSync(to, { recursive: true });
|
|
209
|
+
for (const e of fs.readdirSync(from, { withFileTypes: true })) {
|
|
210
|
+
const a = path.join(from, e.name);
|
|
211
|
+
const b = path.join(to, e.name);
|
|
212
|
+
if (e.isDirectory())
|
|
213
|
+
copyDir(a, b);
|
|
214
|
+
else if (e.isFile())
|
|
215
|
+
fs.copyFileSync(a, b, fs.constants.COPYFILE_EXCL);
|
|
216
|
+
// symlinks and other special files are not followed: a link could point outside the project.
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** Merge rule arrays without duplicates, keeping what is already there first. */
|
|
220
|
+
function unionArr(a, b) {
|
|
221
|
+
const out = Array.isArray(a) ? [...a] : [];
|
|
222
|
+
for (const x of Array.isArray(b) ? b : [])
|
|
223
|
+
if (!out.some((y) => JSON.stringify(y) === JSON.stringify(x)))
|
|
224
|
+
out.push(x);
|
|
225
|
+
return out;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Carry out a plan. Idempotent: a second run finds everything already present and does nothing.
|
|
229
|
+
* Settings are merged additively — existing rules and hooks are kept, new ones appended.
|
|
230
|
+
*/
|
|
231
|
+
function applyImport(plan) {
|
|
232
|
+
const done = [];
|
|
233
|
+
const failed = [];
|
|
234
|
+
let settingsTo = null;
|
|
235
|
+
let settingsFrom = null;
|
|
236
|
+
for (const item of plan.items) {
|
|
237
|
+
try {
|
|
238
|
+
if (item.status === 'copy') {
|
|
239
|
+
fs.mkdirSync(path.dirname(item.to), { recursive: true });
|
|
240
|
+
if (item.kind === 'skill')
|
|
241
|
+
copyDir(item.from, item.to);
|
|
242
|
+
else
|
|
243
|
+
fs.copyFileSync(item.from, item.to, fs.constants.COPYFILE_EXCL);
|
|
244
|
+
done.push(item);
|
|
245
|
+
}
|
|
246
|
+
else if (item.status === 'merge') {
|
|
247
|
+
settingsTo = item.to;
|
|
248
|
+
settingsFrom = item.from; // one merge covers permissions + hooks
|
|
249
|
+
done.push(item);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
failed.push({ item, error: e.message });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (settingsTo && settingsFrom) {
|
|
257
|
+
try {
|
|
258
|
+
const incoming = readJson(settingsFrom);
|
|
259
|
+
if (incoming && incoming.ok) {
|
|
260
|
+
const cur = readJson(settingsTo);
|
|
261
|
+
if (cur && !cur.ok)
|
|
262
|
+
throw new Error(`${settingsTo} exists but is not valid JSON (${cur.error}) — not touching it`);
|
|
263
|
+
const next = cur && cur.ok ? { ...cur.value } : {};
|
|
264
|
+
const wantsPerms = plan.items.some((i) => i.kind === 'permissions' && i.status === 'merge');
|
|
265
|
+
const wantsHooks = plan.items.some((i) => i.kind === 'hooks' && i.status === 'merge');
|
|
266
|
+
if (wantsPerms && incoming.value.permissions && typeof incoming.value.permissions === 'object') {
|
|
267
|
+
const inP = incoming.value.permissions;
|
|
268
|
+
const curP = (next.permissions && typeof next.permissions === 'object' ? next.permissions : {});
|
|
269
|
+
const merged = { ...curP };
|
|
270
|
+
for (const k of ['allow', 'deny', 'ask'])
|
|
271
|
+
if (Array.isArray(inP[k]))
|
|
272
|
+
merged[k] = unionArr(curP[k], inP[k]);
|
|
273
|
+
next.permissions = merged;
|
|
274
|
+
}
|
|
275
|
+
if (wantsHooks && incoming.value.hooks && typeof incoming.value.hooks === 'object') {
|
|
276
|
+
const inH = incoming.value.hooks;
|
|
277
|
+
const curH = (next.hooks && typeof next.hooks === 'object' ? next.hooks : {});
|
|
278
|
+
const merged = { ...curH };
|
|
279
|
+
for (const ev of Object.keys(inH))
|
|
280
|
+
merged[ev] = unionArr(curH[ev], inH[ev]);
|
|
281
|
+
next.hooks = merged;
|
|
282
|
+
}
|
|
283
|
+
fs.mkdirSync(path.dirname(settingsTo), { recursive: true });
|
|
284
|
+
const tmp = `${settingsTo}.${process.pid}.tmp`;
|
|
285
|
+
fs.writeFileSync(tmp, JSON.stringify(next, null, 2) + '\n', 'utf8');
|
|
286
|
+
fs.renameSync(tmp, settingsTo);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
// The merge failed as a unit: report every settings item as failed, not as done.
|
|
291
|
+
for (let i = done.length - 1; i >= 0; i--) {
|
|
292
|
+
const d = done[i];
|
|
293
|
+
if (d.status === 'merge') {
|
|
294
|
+
done.splice(i, 1);
|
|
295
|
+
failed.push({ item: d, error: e.message });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return { done, failed };
|
|
301
|
+
}
|
|
302
|
+
const KIND_LABEL = {
|
|
303
|
+
command: 'command',
|
|
304
|
+
agent: 'agent',
|
|
305
|
+
skill: 'skill',
|
|
306
|
+
brief: 'brief',
|
|
307
|
+
permissions: 'permissions',
|
|
308
|
+
hooks: 'hooks',
|
|
309
|
+
};
|
|
310
|
+
function formatPlan(plan, apply, base) {
|
|
311
|
+
const rel = (p) => p.startsWith(base) ? path.relative(base, p) || '.' : p.replace(process.env.HOME ?? '\u0000', '~');
|
|
312
|
+
if (plan.empty)
|
|
313
|
+
return ['Nothing to import: no .claude/ commands, agents, skills or settings, and no CLAUDE.md here.'];
|
|
314
|
+
const lines = [apply ? 'Imported:' : 'Would import (dry run — nothing written):', ''];
|
|
315
|
+
const verb = (s) => s === 'copy'
|
|
316
|
+
? apply
|
|
317
|
+
? 'copied '
|
|
318
|
+
: 'copy '
|
|
319
|
+
: s === 'merge'
|
|
320
|
+
? apply
|
|
321
|
+
? 'merged '
|
|
322
|
+
: 'merge '
|
|
323
|
+
: s === 'skip-exists'
|
|
324
|
+
? 'skip '
|
|
325
|
+
: 'skip ';
|
|
326
|
+
for (const i of plan.items) {
|
|
327
|
+
const tail = i.status === 'skip-exists' ? ' (already exists — kept yours)' : i.note ? ` (${i.note})` : '';
|
|
328
|
+
lines.push(` ${verb(i.status)}${KIND_LABEL[i.kind].padEnd(11)} ${rel(i.from)} → ${rel(i.to)}${tail}`);
|
|
329
|
+
}
|
|
330
|
+
if (plan.ignoredSettings.length) {
|
|
331
|
+
lines.push('', `Not imported (no equivalent, or it would mean something different here): ${plan.ignoredSettings.join(', ')}`);
|
|
332
|
+
}
|
|
333
|
+
if (!apply && plan.items.some((i) => i.status === 'copy' || i.status === 'merge'))
|
|
334
|
+
lines.push('', 'Run /import --apply to do it.');
|
|
335
|
+
return lines;
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=claudeImport.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './types';
|
|
2
2
|
export * from './util/safeSlice';
|
|
3
|
+
export * from './util/cellWidth';
|
|
3
4
|
export * from './auth/index';
|
|
4
5
|
export * from './api/client';
|
|
5
6
|
export * from './tools/executor';
|
|
@@ -15,6 +16,7 @@ export * from './agent/claimEvidence';
|
|
|
15
16
|
export * from './agent/audit';
|
|
16
17
|
export * from './agent/memory';
|
|
17
18
|
export * from './agent/skills';
|
|
19
|
+
export * from './agent/outputStyles';
|
|
18
20
|
export * from './agent/nestedInstructions';
|
|
19
21
|
export * from './mcp/client';
|
|
20
22
|
export * from './mcp/httpClient';
|
|
@@ -32,6 +34,7 @@ export * from './permissions/rules';
|
|
|
32
34
|
export * from './permissions/modePolicy';
|
|
33
35
|
export * from './permissions/bashClassify';
|
|
34
36
|
export * from './permissions/destructive';
|
|
37
|
+
export * from './permissions/autoMode';
|
|
35
38
|
export * from './plugins/index';
|
|
36
39
|
export * from './plugins/installer';
|
|
37
40
|
export * from './plugins/sources';
|
|
@@ -46,4 +49,35 @@ export * from './agent/taskEvents';
|
|
|
46
49
|
export * from './agent/peerRegistry';
|
|
47
50
|
export * from './agent/peerTransport';
|
|
48
51
|
export * from './agent/askOnce';
|
|
52
|
+
export * from './util/settingsFile';
|
|
53
|
+
export * from './diff/diffView';
|
|
54
|
+
export * from './diff/reviewQueue';
|
|
55
|
+
export * from './diff/collect';
|
|
56
|
+
export * from './project/projectCommands';
|
|
57
|
+
export * from './verify/failureTimeline';
|
|
58
|
+
export * from './verify/verification';
|
|
59
|
+
export * from './util/duration';
|
|
60
|
+
export * from './context/contextFiles';
|
|
61
|
+
export * from './events/sessionEvents';
|
|
62
|
+
export * from './events/recap';
|
|
63
|
+
export * from './events/sessionStats';
|
|
64
|
+
export * from './ui/notify';
|
|
65
|
+
export * from './import/claudeImport';
|
|
66
|
+
export * from './ui/configCmd';
|
|
67
|
+
export * from './util/addDir';
|
|
68
|
+
export * from './util/toolLabel';
|
|
69
|
+
export * from './search/conversationTurns';
|
|
70
|
+
export * from './search/globalSearch';
|
|
71
|
+
export * from './util/loopJobs';
|
|
72
|
+
export * from './agent/goal';
|
|
73
|
+
export * from './api/scheduleLines';
|
|
74
|
+
export * from './agent/handoffBrief';
|
|
75
|
+
export * from './api/billingLines';
|
|
76
|
+
export * from './util/batch';
|
|
77
|
+
export * from './ui/taskGraph';
|
|
78
|
+
export * from './ui/deployPanel';
|
|
79
|
+
export * from './share/sessionShare';
|
|
80
|
+
export * from './share/sessionChannel';
|
|
81
|
+
export * from './ui/mergeAssistant';
|
|
82
|
+
export * from './ui/promptSuggest';
|
|
49
83
|
//# sourceMappingURL=index.d.ts.map
|
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,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,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,oBAAoB,CAAC;AACnC,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,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,sBAAsB,CAAC;AACrC,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,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,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,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./types"), exports);
|
|
18
18
|
__exportStar(require("./util/safeSlice"), exports);
|
|
19
|
+
__exportStar(require("./util/cellWidth"), exports);
|
|
19
20
|
__exportStar(require("./auth/index"), exports);
|
|
20
21
|
__exportStar(require("./api/client"), exports);
|
|
21
22
|
__exportStar(require("./tools/executor"), exports);
|
|
@@ -31,6 +32,7 @@ __exportStar(require("./agent/claimEvidence"), exports);
|
|
|
31
32
|
__exportStar(require("./agent/audit"), exports);
|
|
32
33
|
__exportStar(require("./agent/memory"), exports);
|
|
33
34
|
__exportStar(require("./agent/skills"), exports);
|
|
35
|
+
__exportStar(require("./agent/outputStyles"), exports);
|
|
34
36
|
__exportStar(require("./agent/nestedInstructions"), exports);
|
|
35
37
|
__exportStar(require("./mcp/client"), exports);
|
|
36
38
|
__exportStar(require("./mcp/httpClient"), exports);
|
|
@@ -48,6 +50,7 @@ __exportStar(require("./permissions/rules"), exports);
|
|
|
48
50
|
__exportStar(require("./permissions/modePolicy"), exports);
|
|
49
51
|
__exportStar(require("./permissions/bashClassify"), exports);
|
|
50
52
|
__exportStar(require("./permissions/destructive"), exports);
|
|
53
|
+
__exportStar(require("./permissions/autoMode"), exports);
|
|
51
54
|
__exportStar(require("./plugins/index"), exports);
|
|
52
55
|
__exportStar(require("./plugins/installer"), exports);
|
|
53
56
|
__exportStar(require("./plugins/sources"), exports);
|
|
@@ -62,4 +65,35 @@ __exportStar(require("./agent/taskEvents"), exports);
|
|
|
62
65
|
__exportStar(require("./agent/peerRegistry"), exports);
|
|
63
66
|
__exportStar(require("./agent/peerTransport"), exports);
|
|
64
67
|
__exportStar(require("./agent/askOnce"), exports);
|
|
68
|
+
__exportStar(require("./util/settingsFile"), exports);
|
|
69
|
+
__exportStar(require("./diff/diffView"), exports);
|
|
70
|
+
__exportStar(require("./diff/reviewQueue"), exports);
|
|
71
|
+
__exportStar(require("./diff/collect"), exports);
|
|
72
|
+
__exportStar(require("./project/projectCommands"), exports);
|
|
73
|
+
__exportStar(require("./verify/failureTimeline"), exports);
|
|
74
|
+
__exportStar(require("./verify/verification"), exports);
|
|
75
|
+
__exportStar(require("./util/duration"), exports);
|
|
76
|
+
__exportStar(require("./context/contextFiles"), exports);
|
|
77
|
+
__exportStar(require("./events/sessionEvents"), exports);
|
|
78
|
+
__exportStar(require("./events/recap"), exports);
|
|
79
|
+
__exportStar(require("./events/sessionStats"), exports);
|
|
80
|
+
__exportStar(require("./ui/notify"), exports);
|
|
81
|
+
__exportStar(require("./import/claudeImport"), exports);
|
|
82
|
+
__exportStar(require("./ui/configCmd"), exports);
|
|
83
|
+
__exportStar(require("./util/addDir"), exports);
|
|
84
|
+
__exportStar(require("./util/toolLabel"), exports);
|
|
85
|
+
__exportStar(require("./search/conversationTurns"), exports);
|
|
86
|
+
__exportStar(require("./search/globalSearch"), exports);
|
|
87
|
+
__exportStar(require("./util/loopJobs"), exports);
|
|
88
|
+
__exportStar(require("./agent/goal"), exports);
|
|
89
|
+
__exportStar(require("./api/scheduleLines"), exports);
|
|
90
|
+
__exportStar(require("./agent/handoffBrief"), exports);
|
|
91
|
+
__exportStar(require("./api/billingLines"), exports);
|
|
92
|
+
__exportStar(require("./util/batch"), exports);
|
|
93
|
+
__exportStar(require("./ui/taskGraph"), exports);
|
|
94
|
+
__exportStar(require("./ui/deployPanel"), exports);
|
|
95
|
+
__exportStar(require("./share/sessionShare"), exports);
|
|
96
|
+
__exportStar(require("./share/sessionChannel"), exports);
|
|
97
|
+
__exportStar(require("./ui/mergeAssistant"), exports);
|
|
98
|
+
__exportStar(require("./ui/promptSuggest"), exports);
|
|
65
99
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export interface AutoModeLimitDef {
|
|
2
|
+
/** Short name shown by `nex auto-mode defaults` and in reports. */
|
|
3
|
+
label: string;
|
|
4
|
+
/** The prose the classifier reads. One sentence, concrete. */
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The built-in hard limits (CC's `$defaults` for `hard_deny`): unconditional —
|
|
9
|
+
* user intent does NOT clear these. Keep this list SHORT and beyond argument;
|
|
10
|
+
* it exists for the actions no request should ever authorize.
|
|
11
|
+
*/
|
|
12
|
+
export declare const AUTO_MODE_HARD_DENY_DEFAULTS: readonly AutoModeLimitDef[];
|
|
13
|
+
/**
|
|
14
|
+
* The built-in soft limits (CC's `$defaults` for `soft_deny`): block UNLESS the
|
|
15
|
+
* user's own latest message directly and specifically asks for this exact
|
|
16
|
+
* action, or an allow exception matches.
|
|
17
|
+
*/
|
|
18
|
+
export declare const AUTO_MODE_SOFT_DENY_DEFAULTS: readonly AutoModeLimitDef[];
|
|
19
|
+
/** The `$defaults` sentinel (CC's spelling) inside soft_deny / hard_deny lists. */
|
|
20
|
+
export declare const AUTO_MODE_DEFAULTS_SENTINEL = "$defaults";
|
|
21
|
+
export declare const AUTO_MODE_DEFAULT_MAX_CLASSIFICATIONS = 400;
|
|
22
|
+
export declare const AUTO_MODE_DEFAULT_MAX_BUDGET_USD = 0.25;
|
|
23
|
+
export interface AutoModeConfig {
|
|
24
|
+
/** Whether the classifier runs in auto mode at all. Default true. */
|
|
25
|
+
enabled: boolean;
|
|
26
|
+
/** Model for the review call; undefined = the session model. */
|
|
27
|
+
classifierModel?: string;
|
|
28
|
+
/** Prose: trusted infra (repos, buckets, domains, deploy targets). */
|
|
29
|
+
environment: string[];
|
|
30
|
+
/** Pre-approved patterns; clear soft blocks (never hard ones). */
|
|
31
|
+
allow: string[];
|
|
32
|
+
/** Effective soft limits (tier values + built-ins when $defaults applies). */
|
|
33
|
+
softDeny: string[];
|
|
34
|
+
/** Effective hard limits. */
|
|
35
|
+
hardDeny: string[];
|
|
36
|
+
/** Suspend EVERY bash allow rule while classifying (CC's flag). Default false. */
|
|
37
|
+
classifyAllShell: boolean;
|
|
38
|
+
maxClassifications: number;
|
|
39
|
+
maxBudgetUsd: number;
|
|
40
|
+
/** Which file (or '--settings') set which key — for `nex auto-mode config`. */
|
|
41
|
+
sources: Array<{
|
|
42
|
+
file: string;
|
|
43
|
+
keys: string[];
|
|
44
|
+
}>;
|
|
45
|
+
/** Project/local settings that tried to set `autoMode`; ignored for safety. */
|
|
46
|
+
ignoredProjectFiles: string[];
|
|
47
|
+
/** Non-fatal problems (bad types, unknown keys) — reported, never thrown. */
|
|
48
|
+
warnings: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Load the effective auto-mode config.
|
|
52
|
+
*
|
|
53
|
+
* Tier order — LOW to HIGH precedence (a higher tier that defines a key wins
|
|
54
|
+
* WHOLESALE for that key): user < managed < session (`--settings`). Project and
|
|
55
|
+
* settings.local are read ONLY to report that their `autoMode` is ignored;
|
|
56
|
+
* they can never contribute a value. That asymmetry is the whole security
|
|
57
|
+
* model: settings travel with a checkout, and a checkout that could grant
|
|
58
|
+
* itself trust would make the classifier theatre.
|
|
59
|
+
*/
|
|
60
|
+
export declare function loadAutoModeConfig(workDir: string): AutoModeConfig;
|
|
61
|
+
export interface ClassifyPromptInput {
|
|
62
|
+
tool: string;
|
|
63
|
+
input: Record<string, unknown>;
|
|
64
|
+
workDir: string;
|
|
65
|
+
/** Workspace extensions from --add-dir (trusted like the project). */
|
|
66
|
+
extraDirs?: string[];
|
|
67
|
+
/** Recent user messages, oldest → newest; the LAST is the current instruction. */
|
|
68
|
+
intent?: string[];
|
|
69
|
+
cfg: AutoModeConfig;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The review request. Deliberately one flat prompt — the classifier is a fresh,
|
|
73
|
+
* tool-less call (askModelOnce), so everything it may consult must be here:
|
|
74
|
+
* the limits, the environment, the action, and the human's actual words.
|
|
75
|
+
*/
|
|
76
|
+
export declare function classifyPrompt(a: ClassifyPromptInput): string;
|
|
77
|
+
export type AutoModeVerdictAction = 'allow' | 'block-soft' | 'block-hard' | 'unavailable';
|
|
78
|
+
export interface AutoModeVerdict {
|
|
79
|
+
action: AutoModeVerdictAction;
|
|
80
|
+
reason?: string;
|
|
81
|
+
}
|
|
82
|
+
/** A local guard failed us (or the host never called in) — see the design doc. */
|
|
83
|
+
export declare const AUTO_MODE_UNAVAILABLE: AutoModeVerdict;
|
|
84
|
+
/**
|
|
85
|
+
* Parse one line of classifier output. Anything that is not a clear ALLOW is
|
|
86
|
+
* NOT an allow — a mangled or empty reply fails closed (`unavailable`).
|
|
87
|
+
*/
|
|
88
|
+
export declare function parseClassifierReply(text: string | null | undefined): AutoModeVerdict;
|
|
89
|
+
//# sourceMappingURL=autoMode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoMode.d.ts","sourceRoot":"","sources":["../../src/permissions/autoMode.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,gBAAgB,EAmBnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,gBAAgB,EAiBnE,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,2BAA2B,cAAc,CAAC;AAEvD,eAAO,MAAM,qCAAqC,MAAM,CAAC;AACzD,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kEAAkE;IAClE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kFAAkF;IAClF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjD,+EAA+E;IAC/E,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAgED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAqFlE;AASD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,EAAE,cAAc,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CA4C7D;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;AAE1F,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,eAGnC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,CAcrF"}
|