@nexrall/code-core 1.4.71 → 1.4.73
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 +14 -6
- 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 -75
- package/dist/agent/iterationPolicy.d.ts.map +1 -1
- package/dist/agent/iterationPolicy.js +26 -23
- package/dist/agent/lifecycleHost.d.ts.map +1 -1
- package/dist/agent/lifecycleHost.js +35 -11
- package/dist/agent/loop.d.ts +22 -4
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +238 -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 +4 -2
- 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 +6 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +64 -31
- 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 +22 -7
- 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 +42 -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 +35 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +135 -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 +454 -168
- 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 +3 -1
- package/package.json +1 -1
package/dist/agent/skills.d.ts
CHANGED
|
@@ -34,6 +34,23 @@ export interface Skill {
|
|
|
34
34
|
metadata?: Record<string, string>;
|
|
35
35
|
/** agentskills.io spec field (experimental) — space-separated tool names the skill declares it needs. Not yet enforced as an allowlist; informational. */
|
|
36
36
|
allowedTools?: string[];
|
|
37
|
+
/**
|
|
38
|
+
* `'fork'` = run the expanded skill as an ISOLATED sub-agent (Claude Code's
|
|
39
|
+
* `context: fork`): the body becomes the child's prompt, the parent
|
|
40
|
+
* conversation is NOT copied in, and only the child's report comes back —
|
|
41
|
+
* the invoking context stays clean. Absent = inject the body inline.
|
|
42
|
+
*/
|
|
43
|
+
context?: 'fork';
|
|
44
|
+
/** Sub-agent type a forked run uses (only with `context: 'fork'`). Default `general-purpose`. */
|
|
45
|
+
agent?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Forked runs are backgrounded by default (CC 2.1.x): the invocation returns
|
|
48
|
+
* as soon as the child starts and the report arrives as a <task-notification>.
|
|
49
|
+
* `background: false` awaits the child and returns its report as the tool
|
|
50
|
+
* result. Only meaningful with `context: 'fork'`; hosts without a background
|
|
51
|
+
* hub always await.
|
|
52
|
+
*/
|
|
53
|
+
background?: boolean;
|
|
37
54
|
}
|
|
38
55
|
/**
|
|
39
56
|
* Discover all skills, with diagnostics.
|
|
@@ -68,6 +85,68 @@ export declare function autoInvokableSkills(skills: Skill[]): Skill[];
|
|
|
68
85
|
export declare function userInvokableSkills(skills: Skill[]): Skill[];
|
|
69
86
|
/** A compact catalogue injected into the system prompt so the model knows what it can auto-invoke via use_skill. */
|
|
70
87
|
export declare function summariseSkills(skills: Skill[]): string;
|
|
88
|
+
/**
|
|
89
|
+
* Every directory skill discovery reads (see loadSkillsWithWarnings), whether or
|
|
90
|
+
* not it exists. Used by watchSkills; plugin asset dirs are in the list only
|
|
91
|
+
* while the plugin is installed — installing or removing one already reloads
|
|
92
|
+
* skills through its own path, so a stale watcher would be harmless anyway.
|
|
93
|
+
*/
|
|
94
|
+
export declare function skillRoots(workDir: string): string[];
|
|
95
|
+
/**
|
|
96
|
+
* Watch every skill root and call `onChange` (debounced) when anything under
|
|
97
|
+
* one moves — the hot reload behind the CLI's mid-session refresh (CC 2.1.x
|
|
98
|
+
* hot-reloads skill files; before this only `/reload` re-read them).
|
|
99
|
+
*
|
|
100
|
+
* Two layers, because neither alone is reliable: fs.watch is the fast path
|
|
101
|
+
* (recursive where the platform allows it — a non-recursive fallback keeps a
|
|
102
|
+
* root that predates a skill dir from going dark), and a low-frequency stat
|
|
103
|
+
* poll backstops the events editors and network filesystems are known to
|
|
104
|
+
* drop. The poll also notices a root that did not exist yet when we started,
|
|
105
|
+
* which is exactly when a user creates their first skill. Returns a disposer.
|
|
106
|
+
*/
|
|
107
|
+
export declare function watchSkills(workDir: string, onChange: () => void, opts?: {
|
|
108
|
+
pollMs?: number;
|
|
109
|
+
roots?: string[];
|
|
110
|
+
}): () => void;
|
|
111
|
+
/**
|
|
112
|
+
* Input fields that name a filesystem path. Drives nested discovery — both the skill
|
|
113
|
+
* scanner below and the nested-instruction scanner in nestedInstructions.ts. Nothing
|
|
114
|
+
* else may read them: the list is a discovery hint, not a general path extractor.
|
|
115
|
+
*/
|
|
116
|
+
export declare const NESTED_PATH_INPUT_KEYS: readonly ["path", "file_path", "source", "destination"];
|
|
117
|
+
/**
|
|
118
|
+
* Is `dir` (absolute, under `workDir`) a place nested discovery should skip? One policy
|
|
119
|
+
* shared by the nested skill and nested instruction scanners: a generated or dependency
|
|
120
|
+
* checkout is not where the user keeps playbooks or briefs, and `node_modules` alone
|
|
121
|
+
* would turn every read of a dependency into a candidate. `node_modules`/`.git` are
|
|
122
|
+
* decided without a git call; everything else asks `git check-ignore`. Cached per
|
|
123
|
+
* directory by the CALLER (the maps live with the scanners so their lifetime matches).
|
|
124
|
+
*/
|
|
125
|
+
export declare function isIgnoredNestedDir(workDir: string, dir: string, cache: Map<string, boolean>): boolean;
|
|
126
|
+
/** Discovers nested `.nexrall/skills` directories as the agent works (see the section comment above). */
|
|
127
|
+
export declare class NestedSkillScanner {
|
|
128
|
+
private readonly workDir;
|
|
129
|
+
private readonly scanned;
|
|
130
|
+
private readonly ignored;
|
|
131
|
+
constructor(workDir: string);
|
|
132
|
+
/**
|
|
133
|
+
* Scan the tool input of one call for filesystem paths and return any skills
|
|
134
|
+
* discovered by this call (usually none). Stateful on purpose: each directory
|
|
135
|
+
* is checked at most once per run, however many files under it are touched.
|
|
136
|
+
*/
|
|
137
|
+
scanInput(input: Record<string, unknown>): Skill[];
|
|
138
|
+
/** Scan the ancestor chain of one touched path. */
|
|
139
|
+
scanPath(touched: string): Skill[];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Resolve a `<dir>:<name>` reference to a nested skill. The scope must be a
|
|
143
|
+
* relative path that stays inside the project — `../elsewhere:x` or an absolute
|
|
144
|
+
* scope is rejected, so a skill reference can never read outside the workdir.
|
|
145
|
+
* Deliberately not cache-backed: callers use this for a MISS (a hit resolves
|
|
146
|
+
* against the list they already hold), and re-reading a few files on a miss is
|
|
147
|
+
* cheaper than keeping a second index honest.
|
|
148
|
+
*/
|
|
149
|
+
export declare function resolveNestedSkill(workDir: string, ref: string): Skill | undefined;
|
|
71
150
|
/**
|
|
72
151
|
* Expand a skill body into a final prompt (same $ARGUMENTS / @file / !`cmd`
|
|
73
152
|
* substitution as slash commands — see commands/loader.ts#expandBody), then
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/skills.js
CHANGED
|
@@ -33,25 +33,41 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NestedSkillScanner = exports.NESTED_PATH_INPUT_KEYS = void 0;
|
|
36
37
|
exports.loadSkillsWithWarnings = loadSkillsWithWarnings;
|
|
37
38
|
exports.loadSkills = loadSkills;
|
|
38
39
|
exports.findSkill = findSkill;
|
|
39
40
|
exports.autoInvokableSkills = autoInvokableSkills;
|
|
40
41
|
exports.userInvokableSkills = userInvokableSkills;
|
|
41
42
|
exports.summariseSkills = summariseSkills;
|
|
43
|
+
exports.skillRoots = skillRoots;
|
|
44
|
+
exports.watchSkills = watchSkills;
|
|
45
|
+
exports.isIgnoredNestedDir = isIgnoredNestedDir;
|
|
46
|
+
exports.resolveNestedSkill = resolveNestedSkill;
|
|
42
47
|
exports.expandSkill = expandSkill;
|
|
43
48
|
const fs = __importStar(require("fs"));
|
|
44
49
|
const path = __importStar(require("path"));
|
|
45
50
|
const os = __importStar(require("os"));
|
|
51
|
+
const child_process_1 = require("child_process");
|
|
46
52
|
const index_1 = require("../plugins/index");
|
|
47
53
|
const loader_1 = require("../commands/loader");
|
|
48
54
|
const frontmatter_1 = require("../util/frontmatter");
|
|
49
55
|
const agentTypes_1 = require("./agentTypes");
|
|
50
56
|
/** Frontmatter keys this parser understands, for typo/unrecognised-key detection (see SkillWarning). */
|
|
51
57
|
const KNOWN_META_KEYS = new Set([
|
|
52
|
-
'name',
|
|
53
|
-
'
|
|
54
|
-
'
|
|
58
|
+
'name',
|
|
59
|
+
'description',
|
|
60
|
+
'model',
|
|
61
|
+
'mode',
|
|
62
|
+
'disable-model-invocation',
|
|
63
|
+
'user-invocable',
|
|
64
|
+
'license',
|
|
65
|
+
'compatibility',
|
|
66
|
+
'metadata',
|
|
67
|
+
'allowed-tools',
|
|
68
|
+
'context',
|
|
69
|
+
'agent',
|
|
70
|
+
'background',
|
|
55
71
|
]);
|
|
56
72
|
// agentskills.io's `name` constraint: 1-64 chars, lowercase alphanumeric and
|
|
57
73
|
// hyphens, no leading/trailing/consecutive hyphens. Validated LENIENTLY here
|
|
@@ -73,11 +89,18 @@ function parseBool(v, fallback) {
|
|
|
73
89
|
function parseSpaceList(v) {
|
|
74
90
|
if (!v)
|
|
75
91
|
return undefined;
|
|
76
|
-
const items = v
|
|
92
|
+
const items = v
|
|
93
|
+
.split(/[,\s]+/)
|
|
94
|
+
.map((t) => t.trim())
|
|
95
|
+
.filter(Boolean);
|
|
77
96
|
return items.length ? items : undefined;
|
|
78
97
|
}
|
|
79
98
|
function toSkill(meta, body, name, source, dir, nested) {
|
|
80
99
|
const model = (0, agentTypes_1.parseModel)(meta.model);
|
|
100
|
+
// `agent:` / `background:` only mean something for a forked skill (CC: "Only
|
|
101
|
+
// applies when context: fork is set") — dropped otherwise, so a stray line
|
|
102
|
+
// cannot quietly change how an inline skill runs. validateSkillMeta warns.
|
|
103
|
+
const isFork = meta.context?.trim().toLowerCase() === 'fork';
|
|
81
104
|
return {
|
|
82
105
|
name,
|
|
83
106
|
description: meta.description || `Custom /${name} skill`,
|
|
@@ -92,6 +115,9 @@ function toSkill(meta, body, name, source, dir, nested) {
|
|
|
92
115
|
compatibility: meta.compatibility || undefined,
|
|
93
116
|
metadata: nested?.metadata,
|
|
94
117
|
allowedTools: parseSpaceList(meta['allowed-tools']),
|
|
118
|
+
context: isFork ? 'fork' : undefined,
|
|
119
|
+
agent: isFork ? meta.agent?.trim() || undefined : undefined,
|
|
120
|
+
background: isFork && meta.background !== undefined ? parseBool(meta.background, true) : undefined,
|
|
95
121
|
};
|
|
96
122
|
}
|
|
97
123
|
/**
|
|
@@ -110,22 +136,32 @@ function validateSkillMeta(meta, rawName, effectiveName, dirName, file, warnings
|
|
|
110
136
|
return;
|
|
111
137
|
if (!SPEC_NAME_RE.test(rawName)) {
|
|
112
138
|
warnings.push({
|
|
113
|
-
file,
|
|
139
|
+
file,
|
|
140
|
+
name: effectiveName,
|
|
114
141
|
message: `name "${rawName}" does not match the agentskills.io convention (lowercase letters, numbers, and single hyphens only) — loaded anyway, but other clients reading this skill may warn or reject it.`,
|
|
115
142
|
});
|
|
116
143
|
}
|
|
117
144
|
else if (rawName.length > 64) {
|
|
118
|
-
warnings.push({
|
|
145
|
+
warnings.push({
|
|
146
|
+
file,
|
|
147
|
+
name: effectiveName,
|
|
148
|
+
message: `name is ${rawName.length} characters — the spec caps this at 64. Loaded anyway.`,
|
|
149
|
+
});
|
|
119
150
|
}
|
|
120
151
|
if (dirName !== undefined && meta.name && meta.name.trim().toLowerCase() !== dirName.toLowerCase()) {
|
|
121
152
|
warnings.push({
|
|
122
|
-
file,
|
|
153
|
+
file,
|
|
154
|
+
name: effectiveName,
|
|
123
155
|
message: `frontmatter name "${meta.name}" does not match its directory name "${dirName}" — the spec requires them to match for cross-client compatibility. Loaded anyway, using the frontmatter name.`,
|
|
124
156
|
});
|
|
125
157
|
}
|
|
126
158
|
const strayKeys = Object.keys(meta).filter((k) => !KNOWN_META_KEYS.has(k));
|
|
127
159
|
if (strayKeys.length) {
|
|
128
|
-
warnings.push({
|
|
160
|
+
warnings.push({
|
|
161
|
+
file,
|
|
162
|
+
name: effectiveName,
|
|
163
|
+
message: `has unrecognised frontmatter key(s): ${strayKeys.join(', ')} — these are ignored.`,
|
|
164
|
+
});
|
|
129
165
|
}
|
|
130
166
|
// Same class of mistake agentTypes.ts already guards against for sub-agents:
|
|
131
167
|
// pass the value through regardless (parseModel never rejects), but say
|
|
@@ -134,14 +170,39 @@ function validateSkillMeta(meta, rawName, effectiveName, dirName, file, warnings
|
|
|
134
170
|
// (a valid tier alias) silently parsed to undefined in a skill because this
|
|
135
171
|
// file carried its own, shorter, independently-drifted copy of the model list.
|
|
136
172
|
const declaredModel = meta.model === undefined ? undefined : (0, agentTypes_1.parseModel)(meta.model);
|
|
137
|
-
if (meta.model !== undefined
|
|
138
|
-
|
|
139
|
-
|| !agentTypes_1.VALID_MODELS.includes(declaredModel))) {
|
|
173
|
+
if (meta.model !== undefined &&
|
|
174
|
+
(declaredModel === undefined || !agentTypes_1.VALID_MODELS.includes(declaredModel))) {
|
|
140
175
|
warnings.push({
|
|
141
|
-
file,
|
|
176
|
+
file,
|
|
177
|
+
name: effectiveName,
|
|
142
178
|
message: `has model: "${meta.model}", which this version does not recognise — expected one of ${agentTypes_1.VALID_MODELS.join(', ')}, or omit the line to inherit the current session's model. It will still be sent; the server decides whether it is valid.`,
|
|
143
179
|
});
|
|
144
180
|
}
|
|
181
|
+
// `context: fork` is the only supported value (CC 2.1.x); anything else is a
|
|
182
|
+
// typo the user wants to hear about, not a silent no-op. `agent:`/`background:`
|
|
183
|
+
// are fork-only (CC: "Only applies when context: fork is set") — same reasoning.
|
|
184
|
+
const ctx = meta.context?.trim().toLowerCase();
|
|
185
|
+
if (meta.context !== undefined && ctx !== 'fork') {
|
|
186
|
+
warnings.push({
|
|
187
|
+
file,
|
|
188
|
+
name: effectiveName,
|
|
189
|
+
message: `has context: "${meta.context}" — the only supported value is "fork" (run the skill as an isolated sub-agent). Ignored: the skill will run inline.`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if (ctx !== 'fork' && meta.agent !== undefined) {
|
|
193
|
+
warnings.push({
|
|
194
|
+
file,
|
|
195
|
+
name: effectiveName,
|
|
196
|
+
message: `has agent: "${meta.agent}", which only applies together with context: fork — ignored.`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
if (ctx !== 'fork' && meta.background !== undefined) {
|
|
200
|
+
warnings.push({
|
|
201
|
+
file,
|
|
202
|
+
name: effectiveName,
|
|
203
|
+
message: `has background:, which only applies together with context: fork — ignored.`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
145
206
|
}
|
|
146
207
|
// Legacy flat-file skills: .nexrall/commands/<name>.md (and plugin commands/).
|
|
147
208
|
// Kept as its own loader (rather than merged into loadSkillDir below) since the
|
|
@@ -170,7 +231,11 @@ function loadFlatCommandDir(dir, source, into, warnings) {
|
|
|
170
231
|
into.set(name, toSkill(meta, body, name, source));
|
|
171
232
|
}
|
|
172
233
|
catch (err) {
|
|
173
|
-
warnings?.push({
|
|
234
|
+
warnings?.push({
|
|
235
|
+
file: full,
|
|
236
|
+
name: path.basename(file, '.md'),
|
|
237
|
+
message: `could not be read or parsed (${err.message}) — skipped.`,
|
|
238
|
+
});
|
|
174
239
|
}
|
|
175
240
|
}
|
|
176
241
|
}
|
|
@@ -212,7 +277,11 @@ function loadSkillDir(root, source, into, warnings) {
|
|
|
212
277
|
into.set(name, toSkill(meta, body, name, source, skillDir, nested));
|
|
213
278
|
}
|
|
214
279
|
catch (err) {
|
|
215
|
-
warnings?.push({
|
|
280
|
+
warnings?.push({
|
|
281
|
+
file: skillFile,
|
|
282
|
+
name: entry.name,
|
|
283
|
+
message: `could not be read or parsed (${err.message}) — skipped.`,
|
|
284
|
+
});
|
|
216
285
|
}
|
|
217
286
|
}
|
|
218
287
|
}
|
|
@@ -325,6 +394,326 @@ function summariseSkills(skills) {
|
|
|
325
394
|
return '';
|
|
326
395
|
return list.map((s) => `- ${s.name}: ${s.description}`).join('\n');
|
|
327
396
|
}
|
|
397
|
+
/**
|
|
398
|
+
* Every directory skill discovery reads (see loadSkillsWithWarnings), whether or
|
|
399
|
+
* not it exists. Used by watchSkills; plugin asset dirs are in the list only
|
|
400
|
+
* while the plugin is installed — installing or removing one already reloads
|
|
401
|
+
* skills through its own path, so a stale watcher would be harmless anyway.
|
|
402
|
+
*/
|
|
403
|
+
function skillRoots(workDir) {
|
|
404
|
+
const home = os.homedir();
|
|
405
|
+
return [
|
|
406
|
+
path.join(workDir, '.agents', 'skills'),
|
|
407
|
+
path.join(workDir, '.nexrall', 'commands'),
|
|
408
|
+
path.join(workDir, '.nexrall', 'skills'),
|
|
409
|
+
path.join(home, '.nexrall', 'commands'),
|
|
410
|
+
path.join(home, '.nexrall', 'skills'),
|
|
411
|
+
path.join(home, '.agents', 'skills'),
|
|
412
|
+
...(0, index_1.pluginAssetDirs)(workDir, 'skills'),
|
|
413
|
+
...(0, index_1.pluginAssetDirs)(workDir, 'commands'),
|
|
414
|
+
];
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Cheap stat signature of everything under the roots: entry names + mtimes, plus
|
|
418
|
+
* the mtime of a directory skill's SKILL.md (the file edits actually land in).
|
|
419
|
+
* Two calls with the same string mean discovery has nothing new to find.
|
|
420
|
+
*/
|
|
421
|
+
function rootFingerprint(roots) {
|
|
422
|
+
const lines = [];
|
|
423
|
+
for (const root of roots) {
|
|
424
|
+
let entries;
|
|
425
|
+
try {
|
|
426
|
+
entries = fs.readdirSync(root, { withFileTypes: true });
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
lines.push(`${root} -`);
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
433
|
+
for (const e of entries) {
|
|
434
|
+
const p = path.join(root, e.name);
|
|
435
|
+
let mtime = 0;
|
|
436
|
+
try {
|
|
437
|
+
mtime = fs.statSync(p).mtimeMs;
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
/* vanished between readdir and stat */
|
|
441
|
+
}
|
|
442
|
+
let inner = 0;
|
|
443
|
+
if (e.isDirectory()) {
|
|
444
|
+
try {
|
|
445
|
+
inner = fs.statSync(path.join(p, 'SKILL.md')).mtimeMs;
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
/* not a directory-style skill (or gone) */
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
lines.push(`${p} ${mtime} ${inner}`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return lines.join('\n');
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Watch every skill root and call `onChange` (debounced) when anything under
|
|
458
|
+
* one moves — the hot reload behind the CLI's mid-session refresh (CC 2.1.x
|
|
459
|
+
* hot-reloads skill files; before this only `/reload` re-read them).
|
|
460
|
+
*
|
|
461
|
+
* Two layers, because neither alone is reliable: fs.watch is the fast path
|
|
462
|
+
* (recursive where the platform allows it — a non-recursive fallback keeps a
|
|
463
|
+
* root that predates a skill dir from going dark), and a low-frequency stat
|
|
464
|
+
* poll backstops the events editors and network filesystems are known to
|
|
465
|
+
* drop. The poll also notices a root that did not exist yet when we started,
|
|
466
|
+
* which is exactly when a user creates their first skill. Returns a disposer.
|
|
467
|
+
*/
|
|
468
|
+
function watchSkills(workDir, onChange, opts = {}) {
|
|
469
|
+
const roots = opts.roots ?? skillRoots(workDir);
|
|
470
|
+
const pollMs = opts.pollMs ?? 5000;
|
|
471
|
+
let disposed = false;
|
|
472
|
+
let pending = null;
|
|
473
|
+
let last = rootFingerprint(roots);
|
|
474
|
+
// Everything funnels through the fingerprint before the callback runs. That is
|
|
475
|
+
// not just for the poll: fs.watch is documented as unreliable event-wise, and
|
|
476
|
+
// on macOS a freshly armed recursive watcher fires a synthetic event on the
|
|
477
|
+
// watched dir itself - verified, 2026-10-03 - which would otherwise reload on
|
|
478
|
+
// every startup. "The stats moved" is the one honest signal both layers share.
|
|
479
|
+
const settle = () => {
|
|
480
|
+
pending = null;
|
|
481
|
+
if (disposed)
|
|
482
|
+
return;
|
|
483
|
+
const now = rootFingerprint(roots);
|
|
484
|
+
if (now === last)
|
|
485
|
+
return; // stray arm event, or a rename+change pair already seen
|
|
486
|
+
last = now;
|
|
487
|
+
onChange();
|
|
488
|
+
};
|
|
489
|
+
const fire = () => {
|
|
490
|
+
// Coalesce, never reset: re-arming the timer on every event starves the
|
|
491
|
+
// settle pass whenever events keep arriving inside the window (the poll
|
|
492
|
+
// ticks every 5s by default but tests and busy trees go faster - verified
|
|
493
|
+
// stalling at 100ms, 2026-10-03).
|
|
494
|
+
if (disposed || pending)
|
|
495
|
+
return;
|
|
496
|
+
pending = setTimeout(settle, 150);
|
|
497
|
+
};
|
|
498
|
+
const watchers = [];
|
|
499
|
+
for (const root of roots) {
|
|
500
|
+
try {
|
|
501
|
+
if (!fs.statSync(root).isDirectory())
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
504
|
+
catch {
|
|
505
|
+
continue; // not there yet - the poll notices when it appears
|
|
506
|
+
}
|
|
507
|
+
try {
|
|
508
|
+
const w = fs.watch(root, { recursive: true }, fire);
|
|
509
|
+
w.on('error', () => { });
|
|
510
|
+
watchers.push(w);
|
|
511
|
+
}
|
|
512
|
+
catch {
|
|
513
|
+
try {
|
|
514
|
+
const w = fs.watch(root, fire);
|
|
515
|
+
w.on('error', () => { });
|
|
516
|
+
watchers.push(w);
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
/* no watcher for this root - the poll still covers it */
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const timer = setInterval(() => {
|
|
524
|
+
if (rootFingerprint(roots) !== last)
|
|
525
|
+
fire();
|
|
526
|
+
}, pollMs);
|
|
527
|
+
if (typeof timer.unref === 'function')
|
|
528
|
+
timer.unref();
|
|
529
|
+
return () => {
|
|
530
|
+
disposed = true;
|
|
531
|
+
if (pending)
|
|
532
|
+
clearTimeout(pending);
|
|
533
|
+
clearInterval(timer);
|
|
534
|
+
for (const w of watchers) {
|
|
535
|
+
try {
|
|
536
|
+
w.close();
|
|
537
|
+
}
|
|
538
|
+
catch {
|
|
539
|
+
/* already closed */
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
// ── Nested skills: <dir>/.nexrall/skills discovered as the agent works ────────
|
|
545
|
+
//
|
|
546
|
+
// Claude Code 2.1.x discovers `.claude/skills` in SUBdirectories lazily: the
|
|
547
|
+
// skill only matters once Claude works with files in (or under) that directory,
|
|
548
|
+
// so it is surfaced then instead of at startup. Same here, one level per
|
|
549
|
+
// ancestor: as a tool call touches `packages/cli/src/x.ts`, every directory from
|
|
550
|
+
// `packages/cli/src` up to (but excluding) the project root gets checked for its
|
|
551
|
+
// own `.nexrall/skills`.
|
|
552
|
+
//
|
|
553
|
+
// Nested skills are ALWAYS addressed as `<dir>:<name>` (the project-relative
|
|
554
|
+
// directory, `/`-separated), which is what makes them self-describing: name
|
|
555
|
+
// resolution needs no memory of what was discovered where — the scope in the
|
|
556
|
+
// name IS the lookup path (see resolveNestedSkill). It also means a nested
|
|
557
|
+
// skill can never silently shadow a top-level one.
|
|
558
|
+
//
|
|
559
|
+
// Gitignored directories are skipped: a generated or dependency checkout is not
|
|
560
|
+
// where the user keeps playbooks, and `node_modules` alone would make every
|
|
561
|
+
// read of a dependency a candidate. (Resolution is deliberately more permissive:
|
|
562
|
+
// naming `<dir>:<name>` explicitly still works even inside an ignored dir.)
|
|
563
|
+
/**
|
|
564
|
+
* Input fields that name a filesystem path. Drives nested discovery — both the skill
|
|
565
|
+
* scanner below and the nested-instruction scanner in nestedInstructions.ts. Nothing
|
|
566
|
+
* else may read them: the list is a discovery hint, not a general path extractor.
|
|
567
|
+
*/
|
|
568
|
+
exports.NESTED_PATH_INPUT_KEYS = ['path', 'file_path', 'source', 'destination'];
|
|
569
|
+
/**
|
|
570
|
+
* Is `dir` (absolute, under `workDir`) a place nested discovery should skip? One policy
|
|
571
|
+
* shared by the nested skill and nested instruction scanners: a generated or dependency
|
|
572
|
+
* checkout is not where the user keeps playbooks or briefs, and `node_modules` alone
|
|
573
|
+
* would turn every read of a dependency into a candidate. `node_modules`/`.git` are
|
|
574
|
+
* decided without a git call; everything else asks `git check-ignore`. Cached per
|
|
575
|
+
* directory by the CALLER (the maps live with the scanners so their lifetime matches).
|
|
576
|
+
*/
|
|
577
|
+
function isIgnoredNestedDir(workDir, dir, cache) {
|
|
578
|
+
const cached = cache.get(dir);
|
|
579
|
+
if (cached !== undefined)
|
|
580
|
+
return cached;
|
|
581
|
+
const rel = path.relative(workDir, dir);
|
|
582
|
+
let verdict;
|
|
583
|
+
if (rel.split(/[\\/]/).includes('node_modules') || rel.split(/[\\/]/).includes('.git')) {
|
|
584
|
+
verdict = true; // no git call needed for the two dirs that matter most
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
try {
|
|
588
|
+
const r = (0, child_process_1.spawnSync)('git', ['-C', workDir, 'check-ignore', '-q', '--', dir], {
|
|
589
|
+
stdio: 'ignore',
|
|
590
|
+
timeout: 3000,
|
|
591
|
+
});
|
|
592
|
+
verdict = r.status === 0; // 0 = ignored; 1 = not; anything else (no git, not a repo) = not
|
|
593
|
+
}
|
|
594
|
+
catch {
|
|
595
|
+
verdict = false;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
cache.set(dir, verdict);
|
|
599
|
+
return verdict;
|
|
600
|
+
}
|
|
601
|
+
/** Discovers nested `.nexrall/skills` directories as the agent works (see the section comment above). */
|
|
602
|
+
class NestedSkillScanner {
|
|
603
|
+
constructor(workDir) {
|
|
604
|
+
this.workDir = workDir;
|
|
605
|
+
this.scanned = new Set();
|
|
606
|
+
this.ignored = new Map();
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Scan the tool input of one call for filesystem paths and return any skills
|
|
610
|
+
* discovered by this call (usually none). Stateful on purpose: each directory
|
|
611
|
+
* is checked at most once per run, however many files under it are touched.
|
|
612
|
+
*/
|
|
613
|
+
scanInput(input) {
|
|
614
|
+
const out = [];
|
|
615
|
+
for (const key of exports.NESTED_PATH_INPUT_KEYS) {
|
|
616
|
+
const v = input[key];
|
|
617
|
+
if (typeof v !== 'string' || !v || v.length > 4096)
|
|
618
|
+
continue;
|
|
619
|
+
out.push(...this.scanPath(v));
|
|
620
|
+
}
|
|
621
|
+
return out;
|
|
622
|
+
}
|
|
623
|
+
/** Scan the ancestor chain of one touched path. */
|
|
624
|
+
scanPath(touched) {
|
|
625
|
+
let abs;
|
|
626
|
+
try {
|
|
627
|
+
abs = path.isAbsolute(touched) ? touched : path.join(this.workDir, touched);
|
|
628
|
+
}
|
|
629
|
+
catch {
|
|
630
|
+
return [];
|
|
631
|
+
}
|
|
632
|
+
let base = abs;
|
|
633
|
+
try {
|
|
634
|
+
if (!fs.statSync(abs).isDirectory())
|
|
635
|
+
base = path.dirname(abs);
|
|
636
|
+
}
|
|
637
|
+
catch {
|
|
638
|
+
base = path.dirname(abs); // a path being created: its directory is the claim
|
|
639
|
+
}
|
|
640
|
+
const work = path.resolve(this.workDir);
|
|
641
|
+
const out = [];
|
|
642
|
+
let dir = base;
|
|
643
|
+
for (;;) {
|
|
644
|
+
const rel = path.relative(work, dir);
|
|
645
|
+
if (!rel || rel.startsWith('..') || path.isAbsolute(rel))
|
|
646
|
+
break;
|
|
647
|
+
if (!this.scanned.has(dir)) {
|
|
648
|
+
this.scanned.add(dir);
|
|
649
|
+
const root = path.join(dir, '.nexrall', 'skills');
|
|
650
|
+
let hasRoot = false;
|
|
651
|
+
try {
|
|
652
|
+
hasRoot = fs.statSync(root).isDirectory();
|
|
653
|
+
}
|
|
654
|
+
catch {
|
|
655
|
+
/* the common case - most directories carry no skills */
|
|
656
|
+
}
|
|
657
|
+
if (hasRoot && !isIgnoredNestedDir(this.workDir, dir, this.ignored)) {
|
|
658
|
+
const scope = rel.split(path.sep).join('/');
|
|
659
|
+
const found = new Map();
|
|
660
|
+
loadSkillDir(root, 'project', found);
|
|
661
|
+
for (const skill of found.values()) {
|
|
662
|
+
skill.name = `${scope}:${skill.name}`;
|
|
663
|
+
out.push(skill);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
const parent = path.dirname(dir);
|
|
668
|
+
if (parent === dir)
|
|
669
|
+
break;
|
|
670
|
+
dir = parent;
|
|
671
|
+
}
|
|
672
|
+
return out;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
exports.NestedSkillScanner = NestedSkillScanner;
|
|
676
|
+
/**
|
|
677
|
+
* Resolve a `<dir>:<name>` reference to a nested skill. The scope must be a
|
|
678
|
+
* relative path that stays inside the project — `../elsewhere:x` or an absolute
|
|
679
|
+
* scope is rejected, so a skill reference can never read outside the workdir.
|
|
680
|
+
* Deliberately not cache-backed: callers use this for a MISS (a hit resolves
|
|
681
|
+
* against the list they already hold), and re-reading a few files on a miss is
|
|
682
|
+
* cheaper than keeping a second index honest.
|
|
683
|
+
*/
|
|
684
|
+
function resolveNestedSkill(workDir, ref) {
|
|
685
|
+
const bare = ref.replace(/^\//, '').trim();
|
|
686
|
+
const idx = bare.lastIndexOf(':');
|
|
687
|
+
if (idx <= 0 || idx >= bare.length - 1)
|
|
688
|
+
return undefined;
|
|
689
|
+
const scope = bare.slice(0, idx).trim();
|
|
690
|
+
const name = bare
|
|
691
|
+
.slice(idx + 1)
|
|
692
|
+
.trim()
|
|
693
|
+
.toLowerCase();
|
|
694
|
+
if (!scope || !name)
|
|
695
|
+
return undefined;
|
|
696
|
+
const work = path.resolve(workDir);
|
|
697
|
+
let dir;
|
|
698
|
+
try {
|
|
699
|
+
dir = path.resolve(work, scope);
|
|
700
|
+
}
|
|
701
|
+
catch {
|
|
702
|
+
return undefined;
|
|
703
|
+
}
|
|
704
|
+
const rel = path.relative(work, dir);
|
|
705
|
+
if (!rel || rel.startsWith('..') || path.isAbsolute(rel))
|
|
706
|
+
return undefined;
|
|
707
|
+
const found = new Map();
|
|
708
|
+
loadSkillDir(path.join(dir, '.nexrall', 'skills'), 'project', found);
|
|
709
|
+
const skill = found.get(name);
|
|
710
|
+
if (skill) {
|
|
711
|
+
// Same scoped identity the scanner hands out, so console output, error
|
|
712
|
+
// messages and the model all name the skill the same way.
|
|
713
|
+
skill.name = `${rel.split(path.sep).join('/')}:${skill.name}`;
|
|
714
|
+
}
|
|
715
|
+
return skill;
|
|
716
|
+
}
|
|
328
717
|
/**
|
|
329
718
|
* Expand a skill body into a final prompt (same $ARGUMENTS / @file / !`cmd`
|
|
330
719
|
* substitution as slash commands — see commands/loader.ts#expandBody), then
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subAgentBudget.d.ts","sourceRoot":"","sources":["../../src/agent/subAgentBudget.ts"],"names":[],"mappings":"AAuCA;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAW9F;AAoBD,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAa/F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAgBlF;AA8BD,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,qBAA4B,CAAC;AAE1D,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"subAgentBudget.d.ts","sourceRoot":"","sources":["../../src/agent/subAgentBudget.ts"],"names":[],"mappings":"AAuCA;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAW9F;AAoBD,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAa/F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAgBlF;AA8BD,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,qBAA4B,CAAC;AAE1D,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf;IACD,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb,CAuBA;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C;AAsBD,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAW9C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAGpE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC9B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAuBf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subTask.d.ts","sourceRoot":"","sources":["../../src/agent/subTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAGrF,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"subTask.d.ts","sourceRoot":"","sources":["../../src/agent/subTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAGrF,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAuCzF;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,SAAS,EAAE,EAQvB,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAEvC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,EAIhF,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,CAAC,CA+yBrB"}
|