opencode-rules-md 0.8.6 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/rule-discovery.d.ts.map +1 -1
- package/dist/src/rule-discovery.js +18 -10
- package/dist/src/rule-discovery.js.map +1 -1
- package/dist/src/rule-filter.d.ts +9 -0
- package/dist/src/rule-filter.d.ts.map +1 -1
- package/dist/src/rule-filter.js +48 -11
- package/dist/src/rule-filter.js.map +1 -1
- package/dist/src/rule-metadata.d.ts +2 -0
- package/dist/src/rule-metadata.d.ts.map +1 -1
- package/dist/src/rule-metadata.js +4 -0
- package/dist/src/rule-metadata.js.map +1 -1
- package/dist/src/runtime-context.d.ts +6 -0
- package/dist/src/runtime-context.d.ts.map +1 -1
- package/dist/src/runtime-context.js +16 -0
- package/dist/src/runtime-context.js.map +1 -1
- package/dist/src/session-store.d.ts.map +1 -1
- package/dist/src/session-store.js +1 -0
- package/dist/src/session-store.js.map +1 -1
- package/dist/tui/index.js +13 -9
- package/dist/tui/index.js.map +4 -4
- package/package.json +1 -1
- package/src/rule-discovery.ts +22 -10
- package/src/rule-filter.ts +73 -12
- package/src/rule-metadata.ts +8 -0
- package/src/runtime-context.ts +16 -0
- package/src/session-store.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-discovery.d.ts","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,UAAU,UAAU;IAClB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf;AAOD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoCjC;AAmED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"rule-discovery.d.ts","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,UAAU,UAAU;IAClB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf;AAOD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoCjC;AAmED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CA0C3B"}
|
|
@@ -119,25 +119,33 @@ async function scanDirectoryRecursively(dir, baseDir) {
|
|
|
119
119
|
* Finds all .md and .mdc files including nested subdirectories.
|
|
120
120
|
*/
|
|
121
121
|
export async function discoverRuleFiles(projectDir) {
|
|
122
|
-
|
|
123
|
-
//
|
|
122
|
+
// Keyed by relativePath; later insertions shadow earlier ones.
|
|
123
|
+
// Global rules are inserted first (lowest precedence); project-local rules
|
|
124
|
+
// are inserted after and overwrite any global entry sharing the same key.
|
|
125
|
+
const byRelativePath = new Map();
|
|
126
|
+
// Discover global rules (recursively) — inserted first (lowest precedence).
|
|
124
127
|
const globalRulesDir = getGlobalRulesDir();
|
|
125
128
|
if (globalRulesDir) {
|
|
126
129
|
const globalRules = await scanDirectoryRecursively(globalRulesDir, globalRulesDir);
|
|
127
|
-
for (const
|
|
128
|
-
debugLog(`Discovered global rule: ${relativePath} (${filePath})`);
|
|
129
|
-
|
|
130
|
+
for (const rule of globalRules) {
|
|
131
|
+
debugLog(`Discovered global rule: ${rule.relativePath} (${rule.filePath})`);
|
|
132
|
+
byRelativePath.set(rule.relativePath, rule);
|
|
130
133
|
}
|
|
131
134
|
}
|
|
132
|
-
// Discover project-local rules (recursively)
|
|
135
|
+
// Discover project-local rules (recursively) — shadow global duplicates.
|
|
133
136
|
if (projectDir) {
|
|
134
137
|
const projectRulesDir = path.join(projectDir, '.opencode', 'rules');
|
|
135
138
|
const projectRules = await scanDirectoryRecursively(projectRulesDir, projectRulesDir);
|
|
136
|
-
for (const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
+
for (const rule of projectRules) {
|
|
140
|
+
const shadowed = byRelativePath.has(rule.relativePath);
|
|
141
|
+
debugLog(`Discovered project rule: ${rule.relativePath} (${rule.filePath})` +
|
|
142
|
+
(shadowed ? ' [shadows global]' : ''));
|
|
143
|
+
byRelativePath.set(rule.relativePath, rule);
|
|
139
144
|
}
|
|
140
145
|
}
|
|
141
|
-
|
|
146
|
+
// Map preserves insertion order in JS, so global rules keep their relative
|
|
147
|
+
// order and shadowed slots retain their original position but point at the
|
|
148
|
+
// project file.
|
|
149
|
+
return Array.from(byRelativePath.values());
|
|
142
150
|
}
|
|
143
151
|
//# sourceMappingURL=rule-discovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-discovery.js","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rule-discovery.js","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,12 +20,19 @@ export declare function promptMatchesKeywords(prompt: string, keywords: string[]
|
|
|
20
20
|
* @returns true if any required tool is available
|
|
21
21
|
*/
|
|
22
22
|
export declare function toolsMatchAvailable(availableToolIDs: string[], requiredTools: string[]): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Rough token estimate using the chars/4 heuristic.
|
|
25
|
+
* No external dependency; accurate enough for budget decisions.
|
|
26
|
+
*/
|
|
27
|
+
export declare function estimateTokens(text: string): number;
|
|
23
28
|
/**
|
|
24
29
|
* Result of reading and formatting rules
|
|
25
30
|
*/
|
|
26
31
|
export interface FilterResult {
|
|
27
32
|
formattedRules: string;
|
|
28
33
|
matchedPaths: string[];
|
|
34
|
+
/** Estimated token count of formattedRules (0 when empty) */
|
|
35
|
+
tokenEstimate: number;
|
|
29
36
|
}
|
|
30
37
|
/**
|
|
31
38
|
* Runtime filter context for conditional rule matching
|
|
@@ -51,6 +58,8 @@ export interface RuleFilterContext {
|
|
|
51
58
|
os?: string;
|
|
52
59
|
/** Whether running in CI environment */
|
|
53
60
|
ci?: boolean;
|
|
61
|
+
/** Optional hard token cap; lowest-priority rules are dropped when exceeded. */
|
|
62
|
+
maxTokens?: number;
|
|
54
63
|
}
|
|
55
64
|
/**
|
|
56
65
|
* Read and format rule files for system prompt injection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-filter.d.ts","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWzE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAWT;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAOT;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-filter.d.ts","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWzE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAWT;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAOT;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAqNvB"}
|
package/dist/src/rule-filter.js
CHANGED
|
@@ -46,6 +46,15 @@ export function toolsMatchAvailable(availableToolIDs, requiredTools) {
|
|
|
46
46
|
const availableSet = new Set(availableToolIDs);
|
|
47
47
|
return requiredTools.some(tool => availableSet.has(tool));
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Rough token estimate using the chars/4 heuristic.
|
|
51
|
+
* No external dependency; accurate enough for budget decisions.
|
|
52
|
+
*/
|
|
53
|
+
export function estimateTokens(text) {
|
|
54
|
+
if (!text)
|
|
55
|
+
return 0;
|
|
56
|
+
return Math.ceil(text.length / 4);
|
|
57
|
+
}
|
|
49
58
|
/**
|
|
50
59
|
* Read and format rule files for system prompt injection
|
|
51
60
|
* @param files - Array of discovered rule files with paths
|
|
@@ -53,13 +62,13 @@ export function toolsMatchAvailable(availableToolIDs, requiredTools) {
|
|
|
53
62
|
*/
|
|
54
63
|
export async function readAndFormatRules(files, context = {}) {
|
|
55
64
|
if (files.length === 0) {
|
|
56
|
-
return { formattedRules: '', matchedPaths: [] };
|
|
65
|
+
return { formattedRules: '', matchedPaths: [], tokenEstimate: 0 };
|
|
57
66
|
}
|
|
58
|
-
const ruleContents = [];
|
|
59
|
-
const matchedPaths = [];
|
|
60
67
|
const availableToolSet = context.availableToolIDs && context.availableToolIDs.length > 0
|
|
61
68
|
? new Set(context.availableToolIDs)
|
|
62
69
|
: undefined;
|
|
70
|
+
const entries = [];
|
|
71
|
+
let entryIndex = 0;
|
|
63
72
|
for (const { filePath, relativePath } of files) {
|
|
64
73
|
// Use cached rule data with mtime-based invalidation
|
|
65
74
|
const cachedRule = await getCachedRule(filePath);
|
|
@@ -163,18 +172,46 @@ export async function readAndFormatRules(files, context = {}) {
|
|
|
163
172
|
}
|
|
164
173
|
debugLog(`Including conditional rule: ${relativePath} (match: ${mode}, checks: ${declaredChecks.join(', ')})`);
|
|
165
174
|
}
|
|
166
|
-
//
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
175
|
+
// Extract priority (default 0 for selection; undefined in metadata means absent)
|
|
176
|
+
const priority = metadata?.priority ?? 0;
|
|
177
|
+
// Build formatted chunk for token counting
|
|
178
|
+
const formattedChunk = `## ${relativePath}\n\n${strippedContent}`;
|
|
179
|
+
const tokenCount = estimateTokens(formattedChunk);
|
|
180
|
+
entries.push({ filePath, relativePath, strippedContent, priority, tokenCount, index: entryIndex++ });
|
|
181
|
+
}
|
|
182
|
+
if (entries.length === 0) {
|
|
183
|
+
return { formattedRules: '', matchedPaths: [], tokenEstimate: 0 };
|
|
170
184
|
}
|
|
171
|
-
|
|
172
|
-
|
|
185
|
+
// Determine which entries to include based on budget
|
|
186
|
+
const maxTokens = context.maxTokens;
|
|
187
|
+
const hasValidBudget = typeof maxTokens === 'number' && maxTokens > 0 && Number.isFinite(maxTokens);
|
|
188
|
+
let survivors;
|
|
189
|
+
if (!hasValidBudget) {
|
|
190
|
+
// No budget: use discovery order (existing behavior)
|
|
191
|
+
survivors = entries;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Valid budget: stable sort by priority desc, index asc
|
|
195
|
+
const sorted = [...entries].sort((a, b) => (b.priority - a.priority) || (a.index - b.index));
|
|
196
|
+
// Greedy selection: always keep first (≥1 survivor invariant), then add while within budget
|
|
197
|
+
survivors = [sorted[0]];
|
|
198
|
+
let runningTokens = sorted[0].tokenCount;
|
|
199
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
200
|
+
if (runningTokens + sorted[i].tokenCount <= maxTokens) {
|
|
201
|
+
survivors.push(sorted[i]);
|
|
202
|
+
runningTokens += sorted[i].tokenCount;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
173
205
|
}
|
|
206
|
+
// Build output from survivors
|
|
207
|
+
const ruleContents = survivors.map(entry => `## ${entry.relativePath}\n\n${entry.strippedContent}`);
|
|
208
|
+
const matchedPaths = survivors.map(entry => entry.filePath);
|
|
209
|
+
const formattedRules = `# OpenCode Rules\n\nPlease follow the following rules:\n\n` +
|
|
210
|
+
ruleContents.join('\n\n---\n\n');
|
|
174
211
|
return {
|
|
175
|
-
formattedRules
|
|
176
|
-
ruleContents.join('\n\n---\n\n'),
|
|
212
|
+
formattedRules,
|
|
177
213
|
matchedPaths,
|
|
214
|
+
tokenEstimate: estimateTokens(formattedRules),
|
|
178
215
|
};
|
|
179
216
|
}
|
|
180
217
|
//# sourceMappingURL=rule-filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-filter.js","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AAEzE,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAElC;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAgB,EAAE,KAAe;IACzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,QAAkB;IAElB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEzC,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,iDAAiD;QACjD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACpE,yFAAyF;QACzF,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,gBAA0B,EAC1B,aAAuB;IAEvB,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,gCAAgC;IAChC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/C,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-filter.js","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ export interface RuleMetadata {
|
|
|
16
16
|
os?: string[];
|
|
17
17
|
ci?: boolean;
|
|
18
18
|
match?: 'any' | 'all';
|
|
19
|
+
/** Higher priority is kept first when a token budget is enforced. Default 0. */
|
|
20
|
+
priority?: number;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
23
|
* Parse YAML metadata from rule file content using the yaml package.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-metadata.d.ts","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-metadata.d.ts","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkDD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAwE3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcxD"}
|
|
@@ -71,6 +71,10 @@ export function parseRuleMetadata(content) {
|
|
|
71
71
|
if (parsed.match === 'any' || parsed.match === 'all') {
|
|
72
72
|
metadata.match = parsed.match;
|
|
73
73
|
}
|
|
74
|
+
// Extract priority (finite numbers only; non-finite or absent becomes undefined, treated as 0 downstream)
|
|
75
|
+
if (typeof parsed.priority === 'number' && Number.isFinite(parsed.priority)) {
|
|
76
|
+
metadata.priority = parsed.priority;
|
|
77
|
+
}
|
|
74
78
|
// Return metadata only if it has content
|
|
75
79
|
return Object.keys(metadata).length > 0 ? metadata : undefined;
|
|
76
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-metadata.js","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-metadata.js","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,12 @@ export interface BuildFilterContextOptions {
|
|
|
17
17
|
* If process.env.CI is not set (undefined), fall back to provider-specific detection.
|
|
18
18
|
*/
|
|
19
19
|
export declare function detectCiEnvironment(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Resolve the active token budget from the OPENCODE_RULES_MAX_TOKENS env var.
|
|
22
|
+
* Returns undefined when the env var is absent, empty, zero, negative, or non-finite.
|
|
23
|
+
* Positive finite numbers enable budget enforcement.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveMaxTokens(): number | undefined;
|
|
20
26
|
/**
|
|
21
27
|
* Build the filter context object used for rule matching.
|
|
22
28
|
* Assembles runtime information from various sources.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAmB7C;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,EAC/B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAmB7C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAKrD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,EAC/B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAmE5B"}
|
|
@@ -47,6 +47,18 @@ export function detectCiEnvironment() {
|
|
|
47
47
|
isTruthyEnvValue(env.BUILDKITE) ||
|
|
48
48
|
isTruthyEnvValue(env.TEAMCITY_VERSION));
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the active token budget from the OPENCODE_RULES_MAX_TOKENS env var.
|
|
52
|
+
* Returns undefined when the env var is absent, empty, zero, negative, or non-finite.
|
|
53
|
+
* Positive finite numbers enable budget enforcement.
|
|
54
|
+
*/
|
|
55
|
+
export function resolveMaxTokens() {
|
|
56
|
+
const raw = process.env.OPENCODE_RULES_MAX_TOKENS;
|
|
57
|
+
if (!raw)
|
|
58
|
+
return undefined;
|
|
59
|
+
const n = Number(raw);
|
|
60
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
61
|
+
}
|
|
50
62
|
/**
|
|
51
63
|
* Build the filter context object used for rule matching.
|
|
52
64
|
* Assembles runtime information from various sources.
|
|
@@ -101,6 +113,10 @@ export async function buildFilterContext(opts, projectDirectory, debugLog) {
|
|
|
101
113
|
if (gitBranch !== undefined) {
|
|
102
114
|
context.gitBranch = gitBranch;
|
|
103
115
|
}
|
|
116
|
+
const maxTokens = resolveMaxTokens();
|
|
117
|
+
if (maxTokens !== undefined) {
|
|
118
|
+
context.maxTokens = maxTokens;
|
|
119
|
+
}
|
|
104
120
|
debugLog(`Filter context: model=${modelID ?? 'none'}, agent=${agentType ?? 'none'}, ` +
|
|
105
121
|
`command=${command ?? 'none'}, branch=${gitBranch ?? 'none'}, ` +
|
|
106
122
|
`os=${os}, ci=${ci}, projectTags=${projectTags?.join(',') ?? 'none'}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-context.js","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime-context.js","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAK;gBAEL,IAAI,GAAE,mBAAwB;IAI1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3B,GAAG,IAAI,MAAM,EAAE;IAIf,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IASrD,KAAK,IAAI,IAAI;IAMb,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IA6BvE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOtD,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAS,GACb,OAAO;
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAK;gBAEL,IAAI,GAAE,mBAAwB;IAI1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3B,GAAG,IAAI,MAAM,EAAE;IAIf,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IASrD,KAAK,IAAI,IAAI;IAMb,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IA6BvE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOtD,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAS,GACb,OAAO;IAsBV,OAAO,CAAC,kBAAkB;CAS3B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAE3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/index.js
CHANGED
|
@@ -79,6 +79,9 @@ function parseRuleMetadata(content) {
|
|
|
79
79
|
if (parsed.match === "any" || parsed.match === "all") {
|
|
80
80
|
metadata.match = parsed.match;
|
|
81
81
|
}
|
|
82
|
+
if (typeof parsed.priority === "number" && Number.isFinite(parsed.priority)) {
|
|
83
|
+
metadata.priority = parsed.priority;
|
|
84
|
+
}
|
|
82
85
|
return Object.keys(metadata).length > 0 ? metadata : undefined;
|
|
83
86
|
} catch (error) {
|
|
84
87
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -166,24 +169,25 @@ async function scanDirectoryRecursively(dir, baseDir) {
|
|
|
166
169
|
return results;
|
|
167
170
|
}
|
|
168
171
|
async function discoverRuleFiles(projectDir) {
|
|
169
|
-
const
|
|
172
|
+
const byRelativePath = new Map;
|
|
170
173
|
const globalRulesDir = getGlobalRulesDir();
|
|
171
174
|
if (globalRulesDir) {
|
|
172
175
|
const globalRules = await scanDirectoryRecursively(globalRulesDir, globalRulesDir);
|
|
173
|
-
for (const
|
|
174
|
-
debugLog(`Discovered global rule: ${relativePath} (${filePath})`);
|
|
175
|
-
|
|
176
|
+
for (const rule of globalRules) {
|
|
177
|
+
debugLog(`Discovered global rule: ${rule.relativePath} (${rule.filePath})`);
|
|
178
|
+
byRelativePath.set(rule.relativePath, rule);
|
|
176
179
|
}
|
|
177
180
|
}
|
|
178
181
|
if (projectDir) {
|
|
179
182
|
const projectRulesDir = path.join(projectDir, ".opencode", "rules");
|
|
180
183
|
const projectRules = await scanDirectoryRecursively(projectRulesDir, projectRulesDir);
|
|
181
|
-
for (const
|
|
182
|
-
|
|
183
|
-
|
|
184
|
+
for (const rule of projectRules) {
|
|
185
|
+
const shadowed = byRelativePath.has(rule.relativePath);
|
|
186
|
+
debugLog(`Discovered project rule: ${rule.relativePath} (${rule.filePath})` + (shadowed ? " [shadows global]" : ""));
|
|
187
|
+
byRelativePath.set(rule.relativePath, rule);
|
|
184
188
|
}
|
|
185
189
|
}
|
|
186
|
-
return
|
|
190
|
+
return Array.from(byRelativePath.values());
|
|
187
191
|
}
|
|
188
192
|
|
|
189
193
|
// src/active-rules-state.ts
|
|
@@ -844,5 +848,5 @@ export {
|
|
|
844
848
|
tui_default as default
|
|
845
849
|
};
|
|
846
850
|
|
|
847
|
-
//# debugId=
|
|
851
|
+
//# debugId=8A2B78FD948E5F6364756E2164756E21
|
|
848
852
|
//# sourceMappingURL=index.js.map
|
package/dist/tui/index.js.map
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { createComponent as _$createComponent } from \"@opentui/solid\";\n// tui/index.tsx\n/** @jsxImportSource @opentui/solid */\n\nimport { SidebarContent } from './slots/sidebar-content.js';\nconst id = 'opencode-rules-md';\nconst tui = async api => {\n api.slots.register({\n order: 350,\n slots: {\n sidebar_content: (ctx, props) => _$createComponent(SidebarContent, {\n get sessionId() {\n return props.session_id;\n },\n api: api,\n get theme() {\n return ctx.theme;\n }\n })\n }\n });\n};\nexport default {\n id,\n tui\n};",
|
|
6
6
|
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { memo as _$memo } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n// tui/slots/sidebar-content.tsx\n/** @jsxImportSource @opentui/solid */\nimport { createSignal, createEffect, createMemo, onCleanup, Show, For } from 'solid-js';\nimport { loadSidebarRules } from '../data/rules.js';\nfunction RuleSection(props) {\n const activeCount = createMemo(() => props.rules.filter(r => r.isActive === true).length);\n const headerCount = createMemo(() => {\n if (props.hasEvaluationState) {\n return `(${activeCount()}/${props.rules.length})`;\n }\n return `(${props.rules.length})`;\n });\n const bulletColor = rule => {\n return rule.isActive === true ? props.theme.success : props.theme.textMuted;\n };\n return _$createComponent(Show, {\n get when() {\n return props.rules.length > 0;\n },\n get children() {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$2, \"onMouseDown\", () => props.onToggle());\n _$insert(_el$3, () => props.open ? '▼' : '▶');\n _$insert(_el$4, () => props.title, null);\n _$insert(_el$4, _$createComponent(Show, {\n get when() {\n return !props.open;\n },\n get children() {\n var _el$5 = _$createElement(\"span\"),\n _el$6 = _$createTextNode(` `);\n _$insertNode(_el$5, _el$6);\n _$insert(_el$5, headerCount, null);\n _$effect(_$p => _$setProp(_el$5, \"style\", {\n fg: props.theme.textMuted\n }, _$p));\n return _el$5;\n }\n }), null);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return props.open;\n },\n get children() {\n return _$createComponent(For, {\n get each() {\n return props.rules;\n },\n children: (rule, localIndex) => {\n const globalIndex = () => props.globalOffset + localIndex();\n return (() => {\n var _el$7 = _$createElement(\"box\"),\n _el$8 = _$createElement(\"box\"),\n _el$9 = _$createElement(\"text\"),\n _el$1 = _$createElement(\"text\");\n _$insertNode(_el$7, _el$8);\n _$setProp(_el$7, \"flexDirection\", \"column\");\n _$setProp(_el$7, \"onMouseDown\", () => props.onExpandToggle(globalIndex()));\n _$insertNode(_el$8, _el$9);\n _$insertNode(_el$8, _el$1);\n _$setProp(_el$8, \"flexDirection\", \"row\");\n _$setProp(_el$8, \"gap\", 1);\n _$insertNode(_el$9, _$createTextNode(`•`));\n _$insert(_el$1, () => rule.name);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.expandedIndex === globalIndex();\n },\n get children() {\n var _el$10 = _$createElement(\"box\"),\n _el$11 = _$createElement(\"text\");\n _$insertNode(_el$10, _el$11);\n _$setProp(_el$10, \"flexDirection\", \"column\");\n _$setProp(_el$10, \"paddingLeft\", 4);\n _$insert(_el$11, () => rule.path);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.globs?.length ?? 0) > 0;\n },\n get children() {\n var _el$12 = _$createElement(\"text\"),\n _el$13 = _$createTextNode(`Globs: `);\n _$insertNode(_el$12, _el$13);\n _$insert(_el$12, () => rule.metadata.globs.join(', '), null);\n _$effect(_$p => _$setProp(_el$12, \"fg\", props.theme.textMuted, _$p));\n return _el$12;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.keywords?.length ?? 0) > 0;\n },\n get children() {\n var _el$14 = _$createElement(\"text\"),\n _el$15 = _$createTextNode(`Keywords: `);\n _$insertNode(_el$14, _el$15);\n _$insert(_el$14, () => rule.metadata.keywords.join(', '), null);\n _$effect(_$p => _$setProp(_el$14, \"fg\", props.theme.textMuted, _$p));\n return _el$14;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.tools?.length ?? 0) > 0;\n },\n get children() {\n var _el$16 = _$createElement(\"text\"),\n _el$17 = _$createTextNode(`Tools: `);\n _$insertNode(_el$16, _el$17);\n _$insert(_el$16, () => rule.metadata.tools.join(', '), null);\n _$effect(_$p => _$setProp(_el$16, \"fg\", props.theme.textMuted, _$p));\n return _el$16;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.model?.length ?? 0) > 0;\n },\n get children() {\n var _el$18 = _$createElement(\"text\"),\n _el$19 = _$createTextNode(`Model: `);\n _$insertNode(_el$18, _el$19);\n _$insert(_el$18, () => rule.metadata.model.join(', '), null);\n _$effect(_$p => _$setProp(_el$18, \"fg\", props.theme.textMuted, _$p));\n return _el$18;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.agent?.length ?? 0) > 0;\n },\n get children() {\n var _el$20 = _$createElement(\"text\"),\n _el$21 = _$createTextNode(`Agent: `);\n _$insertNode(_el$20, _el$21);\n _$insert(_el$20, () => rule.metadata.agent.join(', '), null);\n _$effect(_$p => _$setProp(_el$20, \"fg\", props.theme.textMuted, _$p));\n return _el$20;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.command?.length ?? 0) > 0;\n },\n get children() {\n var _el$22 = _$createElement(\"text\"),\n _el$23 = _$createTextNode(`Command: `);\n _$insertNode(_el$22, _el$23);\n _$insert(_el$22, () => rule.metadata.command.join(', '), null);\n _$effect(_$p => _$setProp(_el$22, \"fg\", props.theme.textMuted, _$p));\n return _el$22;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.project?.length ?? 0) > 0;\n },\n get children() {\n var _el$24 = _$createElement(\"text\"),\n _el$25 = _$createTextNode(`Project: `);\n _$insertNode(_el$24, _el$25);\n _$insert(_el$24, () => rule.metadata.project.join(', '), null);\n _$effect(_$p => _$setProp(_el$24, \"fg\", props.theme.textMuted, _$p));\n return _el$24;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.branch?.length ?? 0) > 0;\n },\n get children() {\n var _el$26 = _$createElement(\"text\"),\n _el$27 = _$createTextNode(`Branch: `);\n _$insertNode(_el$26, _el$27);\n _$insert(_el$26, () => rule.metadata.branch.join(', '), null);\n _$effect(_$p => _$setProp(_el$26, \"fg\", props.theme.textMuted, _$p));\n return _el$26;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.os?.length ?? 0) > 0;\n },\n get children() {\n var _el$28 = _$createElement(\"text\"),\n _el$29 = _$createTextNode(`OS: `);\n _$insertNode(_el$28, _el$29);\n _$insert(_el$28, () => rule.metadata.os.join(', '), null);\n _$effect(_$p => _$setProp(_el$28, \"fg\", props.theme.textMuted, _$p));\n return _el$28;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return rule.metadata.ci !== undefined;\n },\n get children() {\n var _el$30 = _$createElement(\"text\"),\n _el$31 = _$createTextNode(`CI: `);\n _$insertNode(_el$30, _el$31);\n _$insert(_el$30, () => String(rule.metadata.ci), null);\n _$effect(_$p => _$setProp(_el$30, \"fg\", props.theme.textMuted, _$p));\n return _el$30;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return rule.metadata.match;\n },\n get children() {\n var _el$32 = _$createElement(\"text\"),\n _el$33 = _$createTextNode(`Match: `);\n _$insertNode(_el$32, _el$33);\n _$insert(_el$32, () => rule.metadata.match, null);\n _$effect(_$p => _$setProp(_el$32, \"fg\", props.theme.textMuted, _$p));\n return _el$32;\n }\n }), null);\n _$effect(_$p => _$setProp(_el$11, \"fg\", props.theme.textMuted, _$p));\n return _el$10;\n }\n }), null);\n _$effect(_p$ => {\n var _v$3 = bulletColor(rule),\n _v$4 = props.theme.text;\n _v$3 !== _p$.e && (_p$.e = _$setProp(_el$9, \"fg\", _v$3, _p$.e));\n _v$4 !== _p$.t && (_p$.t = _$setProp(_el$1, \"fg\", _v$4, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$7;\n })();\n }\n });\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = props.theme.text,\n _v$2 = props.theme.text;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n }\n });\n}\nexport function SidebarContent(props) {\n const [rules, setRules] = createSignal([]);\n const [status, setStatus] = createSignal('loading');\n const [skippedCount, setSkippedCount] = createSignal(0);\n const [hasEvaluationState, setHasEvaluationState] = createSignal(false);\n const [expandedIndex, setExpandedIndex] = createSignal(null);\n const [lastDir, setLastDir] = createSignal(undefined);\n const [lastSessionId, setLastSessionId] = createSignal(undefined);\n const [projectOpen, setProjectOpen] = createSignal(false);\n const [globalOpen, setGlobalOpen] = createSignal(false);\n const [refreshCounter, setRefreshCounter] = createSignal(0);\n const theme = () => props.theme.current;\n const resolveProjectDir = () => {\n return props.api.state.path.directory ?? null;\n };\n\n // Monotonic counter to detect stale async results\n let requestId = 0;\n // Debounce timer for event-driven refresh\n let debounceTimer = null;\n\n // Initial load: triggered by session/directory change, resets all UI state\n const loadRulesInitial = async () => {\n const thisRequest = ++requestId;\n const dir = resolveProjectDir();\n const sessionId = props.sessionId;\n setLastDir(dir);\n setLastSessionId(sessionId);\n setStatus('loading');\n try {\n const result = await loadSidebarRules(dir, sessionId);\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n setRules(result.rules);\n setSkippedCount(result.skippedCount);\n setHasEvaluationState(result.hasEvaluationState);\n setStatus('loaded');\n } catch (err) {\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n console.error('[opencode-rules-md] Failed to load rules:', err);\n setStatus('error');\n }\n };\n\n // Refresh load: triggered by events, only updates rule data (no UI state reset)\n const loadRulesRefresh = async () => {\n // Skip refresh if initial load is still in flight\n if (status() === 'loading') return;\n const thisRequest = ++requestId;\n const dir = resolveProjectDir();\n const sessionId = props.sessionId;\n try {\n const result = await loadSidebarRules(dir, sessionId);\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n setRules(result.rules);\n setSkippedCount(result.skippedCount);\n setHasEvaluationState(result.hasEvaluationState);\n setStatus('loaded');\n } catch (err) {\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n console.error('[opencode-rules-md] Failed to refresh rules:', err);\n }\n };\n\n // Effect 1: Initial load on session/directory change\n createEffect(() => {\n const currentSessionId = props.sessionId;\n const currentDir = resolveProjectDir();\n\n // Check if session or directory changed\n if (currentSessionId !== lastSessionId() || currentDir !== lastDir()) {\n // Clear pending debounce from previous session\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n // Reset UI state on session/directory change\n setExpandedIndex(null);\n setProjectOpen(false);\n setGlobalOpen(false);\n void loadRulesInitial();\n }\n });\n\n // Effect 2: Refresh on event-driven updates (refreshCounter changes)\n createEffect(() => {\n const counter = refreshCounter();\n if (counter > 0) {\n void loadRulesRefresh();\n }\n });\n\n // Subscribe to OpenCode events with debounce\n const triggerRefresh = event => {\n // Filter events to current sessionId before debouncing\n // OpenCode SDK events nest sessionID inside properties: { type, properties: { sessionID, ... } }\n const eventSessionID = event.properties.sessionID;\n if (typeof eventSessionID === 'string' && eventSessionID !== props.sessionId) {\n return;\n }\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n setRefreshCounter(c => c + 1);\n }, 150);\n };\n const unsubMessageUpdated = props.api.event.on('message.updated', triggerRefresh);\n const unsubSessionStatus = props.api.event.on('session.status', triggerRefresh);\n onCleanup(() => {\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n unsubMessageUpdated();\n unsubSessionStatus();\n });\n const toggleExpand = index => {\n setExpandedIndex(prev => prev === index ? null : index);\n };\n const projectRules = createMemo(() => rules().filter(r => r.source === 'project'));\n const globalRules = createMemo(() => rules().filter(r => r.source === 'global'));\n return (() => {\n var _el$34 = _$createElement(\"box\"),\n _el$35 = _$createElement(\"text\"),\n _el$36 = _$createElement(\"b\");\n _$insertNode(_el$34, _el$35);\n _$insertNode(_el$35, _el$36);\n _$insertNode(_el$36, _$createTextNode(`Rules`));\n _$insert(_el$34, _$createComponent(Show, {\n get when() {\n return status() === 'loading';\n },\n get children() {\n var _el$38 = _$createElement(\"text\");\n _$insertNode(_el$38, _$createTextNode(`Loading...`));\n _$effect(_$p => _$setProp(_el$38, \"fg\", theme().textMuted, _$p));\n return _el$38;\n }\n }), null);\n _$insert(_el$34, _$createComponent(Show, {\n get when() {\n return status() === 'error';\n },\n get children() {\n var _el$40 = _$createElement(\"text\");\n _$insertNode(_el$40, _$createTextNode(`Failed to load rules`));\n _$effect(_$p => _$setProp(_el$40, \"fg\", theme().textMuted, _$p));\n return _el$40;\n }\n }), null);\n _$insert(_el$34, _$createComponent(Show, {\n get when() {\n return status() === 'loaded';\n },\n get children() {\n return [_$createComponent(Show, {\n get when() {\n return rules().length > 0;\n },\n get fallback() {\n return (() => {\n var _el$44 = _$createElement(\"text\");\n _$insertNode(_el$44, _$createTextNode(`No rules found`));\n _$effect(_$p => _$setProp(_el$44, \"fg\", theme().textMuted, _$p));\n return _el$44;\n })();\n },\n get children() {\n return [_$createComponent(RuleSection, {\n title: \"Project\",\n get rules() {\n return projectRules();\n },\n get theme() {\n return theme();\n },\n get open() {\n return projectOpen();\n },\n onToggle: () => setProjectOpen(x => !x),\n get expandedIndex() {\n return expandedIndex();\n },\n globalOffset: 0,\n onExpandToggle: toggleExpand,\n get hasEvaluationState() {\n return hasEvaluationState();\n }\n }), _$createComponent(RuleSection, {\n title: \"Global\",\n get rules() {\n return globalRules();\n },\n get theme() {\n return theme();\n },\n get open() {\n return globalOpen();\n },\n onToggle: () => setGlobalOpen(x => !x),\n get expandedIndex() {\n return expandedIndex();\n },\n get globalOffset() {\n return projectRules().length;\n },\n onExpandToggle: toggleExpand,\n get hasEvaluationState() {\n return hasEvaluationState();\n }\n })];\n }\n }), _$createComponent(Show, {\n get when() {\n return skippedCount() > 0;\n },\n get children() {\n var _el$42 = _$createElement(\"text\"),\n _el$43 = _$createTextNode(` rules skipped (unreadable)`);\n _$insertNode(_el$42, _el$43);\n _$insert(_el$42, skippedCount, _el$43);\n _$effect(_$p => _$setProp(_el$42, \"fg\", theme().textMuted, _$p));\n return _el$42;\n }\n })];\n }\n }), null);\n _$effect(_$p => _$setProp(_el$35, \"fg\", theme().text, _$p));\n return _el$34;\n })();\n}",
|
|
7
|
-
"/**\n * Rule file discovery utilities\n */\n\nimport { stat, readFile, readdir } from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\nimport { createDebugLog } from './debug.js';\nimport {\n parseRuleMetadata,\n stripFrontmatter,\n type RuleMetadata,\n} from './rule-metadata.js';\n\nconst debugLog = createDebugLog();\n\n/**\n * Cached rule data for performance optimization\n */\ninterface CachedRule {\n /** Raw file content */\n content: string;\n /** Parsed metadata from frontmatter */\n metadata: RuleMetadata | undefined;\n /** Content with frontmatter stripped */\n strippedContent: string;\n /** File modification time for cache invalidation */\n mtime: number;\n}\n\n/**\n * Rule cache keyed by absolute file path\n */\nconst ruleCache = new Map<string, CachedRule>();\n\n/**\n * Clear the rule cache (useful for testing or manual invalidation)\n */\nexport function clearRuleCache(): void {\n ruleCache.clear();\n}\n\n/**\n * Get cached rule data, refreshing from disk if file has changed.\n * Uses mtime-based invalidation to detect file changes.\n *\n * @param filePath - Absolute path to the rule file\n * @returns Cached rule data or undefined if file cannot be read\n */\nexport async function getCachedRule(\n filePath: string\n): Promise<CachedRule | undefined> {\n try {\n const stats = await stat(filePath);\n const mtime = stats.mtimeMs;\n\n // Check if we have a valid cached entry\n const cached = ruleCache.get(filePath);\n if (cached && cached.mtime === mtime) {\n debugLog(`Cache hit: ${filePath}`);\n return cached;\n }\n\n // Read and cache the file\n debugLog(`Cache miss: ${filePath}`);\n const content = await readFile(filePath, 'utf-8');\n const metadata = parseRuleMetadata(content);\n const strippedContent = stripFrontmatter(content);\n\n const entry: CachedRule = {\n content,\n metadata,\n strippedContent,\n mtime,\n };\n\n ruleCache.set(filePath, entry);\n return entry;\n } catch (error) {\n // Remove stale cache entry if file no longer exists\n ruleCache.delete(filePath);\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read rule file ${filePath}: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Get the global rules directory path\n */\nfunction getGlobalRulesDir(): string | null {\n const opencodeConfigDir = process.env.OPENCODE_CONFIG_DIR;\n if (opencodeConfigDir) {\n return path.join(opencodeConfigDir, 'rules');\n }\n\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return path.join(xdgConfigHome, 'opencode', 'rules');\n }\n\n const homeDir = process.env.HOME || os.homedir();\n return path.join(homeDir, '.config', 'opencode', 'rules');\n}\n\n/**\n * Recursively scan a directory for markdown rule files\n * Skips hidden files and directories (starting with .)\n * @param dir - Directory to scan\n * @param baseDir - Base directory for relative path calculation\n * @returns Array of discovered file paths with their relative paths from baseDir\n */\nasync function scanDirectoryRecursively(\n dir: string,\n baseDir: string\n): Promise<Array<{ filePath: string; relativePath: string }>> {\n const results: Array<{ filePath: string; relativePath: string }> = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n // Skip hidden files and directories\n if (entry.name.startsWith('.')) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n results.push(...(await scanDirectoryRecursively(fullPath, baseDir)));\n } else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdc')) {\n // Add markdown file\n const relativePath = path.relative(baseDir, fullPath);\n results.push({ filePath: fullPath, relativePath });\n }\n }\n } catch (error) {\n // Treat ENOENT as benign (directory doesn't exist or was deleted)\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return results;\n }\n // Log non-ENOENT directory read errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read directory ${dir}: ${message}`\n );\n }\n\n return results;\n}\n\n/**\n * Discovered rule file with both absolute and relative paths\n */\nexport interface DiscoveredRule {\n /** Absolute path to the rule file */\n filePath: string;\n /** Relative path from the rules directory root (for unique headings) */\n relativePath: string;\n}\n\n/**\n * Discover markdown rule files from standard directories\n * Searches recursively in:\n * - $OPENCODE_CONFIG_DIR/rules/ (highest priority)\n * - $XDG_CONFIG_HOME/opencode/rules/ (or ~/.config/opencode/rules as fallback)\n * - .opencode/rules/ (in project directory if provided)\n * Finds all .md and .mdc files including nested subdirectories.\n */\nexport async function discoverRuleFiles(\n projectDir?: string\n): Promise<DiscoveredRule[]> {\n const
|
|
7
|
+
"/**\n * Rule file discovery utilities\n */\n\nimport { stat, readFile, readdir } from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\nimport { createDebugLog } from './debug.js';\nimport {\n parseRuleMetadata,\n stripFrontmatter,\n type RuleMetadata,\n} from './rule-metadata.js';\n\nconst debugLog = createDebugLog();\n\n/**\n * Cached rule data for performance optimization\n */\ninterface CachedRule {\n /** Raw file content */\n content: string;\n /** Parsed metadata from frontmatter */\n metadata: RuleMetadata | undefined;\n /** Content with frontmatter stripped */\n strippedContent: string;\n /** File modification time for cache invalidation */\n mtime: number;\n}\n\n/**\n * Rule cache keyed by absolute file path\n */\nconst ruleCache = new Map<string, CachedRule>();\n\n/**\n * Clear the rule cache (useful for testing or manual invalidation)\n */\nexport function clearRuleCache(): void {\n ruleCache.clear();\n}\n\n/**\n * Get cached rule data, refreshing from disk if file has changed.\n * Uses mtime-based invalidation to detect file changes.\n *\n * @param filePath - Absolute path to the rule file\n * @returns Cached rule data or undefined if file cannot be read\n */\nexport async function getCachedRule(\n filePath: string\n): Promise<CachedRule | undefined> {\n try {\n const stats = await stat(filePath);\n const mtime = stats.mtimeMs;\n\n // Check if we have a valid cached entry\n const cached = ruleCache.get(filePath);\n if (cached && cached.mtime === mtime) {\n debugLog(`Cache hit: ${filePath}`);\n return cached;\n }\n\n // Read and cache the file\n debugLog(`Cache miss: ${filePath}`);\n const content = await readFile(filePath, 'utf-8');\n const metadata = parseRuleMetadata(content);\n const strippedContent = stripFrontmatter(content);\n\n const entry: CachedRule = {\n content,\n metadata,\n strippedContent,\n mtime,\n };\n\n ruleCache.set(filePath, entry);\n return entry;\n } catch (error) {\n // Remove stale cache entry if file no longer exists\n ruleCache.delete(filePath);\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read rule file ${filePath}: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Get the global rules directory path\n */\nfunction getGlobalRulesDir(): string | null {\n const opencodeConfigDir = process.env.OPENCODE_CONFIG_DIR;\n if (opencodeConfigDir) {\n return path.join(opencodeConfigDir, 'rules');\n }\n\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return path.join(xdgConfigHome, 'opencode', 'rules');\n }\n\n const homeDir = process.env.HOME || os.homedir();\n return path.join(homeDir, '.config', 'opencode', 'rules');\n}\n\n/**\n * Recursively scan a directory for markdown rule files\n * Skips hidden files and directories (starting with .)\n * @param dir - Directory to scan\n * @param baseDir - Base directory for relative path calculation\n * @returns Array of discovered file paths with their relative paths from baseDir\n */\nasync function scanDirectoryRecursively(\n dir: string,\n baseDir: string\n): Promise<Array<{ filePath: string; relativePath: string }>> {\n const results: Array<{ filePath: string; relativePath: string }> = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n // Skip hidden files and directories\n if (entry.name.startsWith('.')) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n results.push(...(await scanDirectoryRecursively(fullPath, baseDir)));\n } else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdc')) {\n // Add markdown file\n const relativePath = path.relative(baseDir, fullPath);\n results.push({ filePath: fullPath, relativePath });\n }\n }\n } catch (error) {\n // Treat ENOENT as benign (directory doesn't exist or was deleted)\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return results;\n }\n // Log non-ENOENT directory read errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read directory ${dir}: ${message}`\n );\n }\n\n return results;\n}\n\n/**\n * Discovered rule file with both absolute and relative paths\n */\nexport interface DiscoveredRule {\n /** Absolute path to the rule file */\n filePath: string;\n /** Relative path from the rules directory root (for unique headings) */\n relativePath: string;\n}\n\n/**\n * Discover markdown rule files from standard directories\n * Searches recursively in:\n * - $OPENCODE_CONFIG_DIR/rules/ (highest priority)\n * - $XDG_CONFIG_HOME/opencode/rules/ (or ~/.config/opencode/rules as fallback)\n * - .opencode/rules/ (in project directory if provided)\n * Finds all .md and .mdc files including nested subdirectories.\n */\nexport async function discoverRuleFiles(\n projectDir?: string\n): Promise<DiscoveredRule[]> {\n // Keyed by relativePath; later insertions shadow earlier ones.\n // Global rules are inserted first (lowest precedence); project-local rules\n // are inserted after and overwrite any global entry sharing the same key.\n const byRelativePath = new Map<string, DiscoveredRule>();\n\n // Discover global rules (recursively) — inserted first (lowest precedence).\n const globalRulesDir = getGlobalRulesDir();\n if (globalRulesDir) {\n const globalRules = await scanDirectoryRecursively(\n globalRulesDir,\n globalRulesDir\n );\n for (const rule of globalRules) {\n debugLog(\n `Discovered global rule: ${rule.relativePath} (${rule.filePath})`\n );\n byRelativePath.set(rule.relativePath, rule);\n }\n }\n\n // Discover project-local rules (recursively) — shadow global duplicates.\n if (projectDir) {\n const projectRulesDir = path.join(projectDir, '.opencode', 'rules');\n const projectRules = await scanDirectoryRecursively(\n projectRulesDir,\n projectRulesDir\n );\n for (const rule of projectRules) {\n const shadowed = byRelativePath.has(rule.relativePath);\n debugLog(\n `Discovered project rule: ${rule.relativePath} (${rule.filePath})` +\n (shadowed ? ' [shadows global]' : '')\n );\n byRelativePath.set(rule.relativePath, rule);\n }\n }\n\n // Map preserves insertion order in JS, so global rules keep their relative\n // order and shadowed slots retain their original position but point at the\n // project file.\n return Array.from(byRelativePath.values());\n}\n",
|
|
8
8
|
"export type DebugLog = (message: string) => void;\n\nexport function createDebugLog(prefix = '[opencode-rules-md]'): DebugLog {\n return (message: string): void => {\n if (process.env.OPENCODE_RULES_DEBUG) {\n console.debug(`${prefix} ${message}`);\n }\n };\n}\n",
|
|
9
|
-
"/**\n * Rule metadata parsing and frontmatter extraction\n */\n\nconst { parse: parseYaml } = await import('yaml');\n\n/**\n * Metadata extracted from .mdc file frontmatter\n */\nexport interface RuleMetadata {\n globs?: string[];\n keywords?: string[];\n tools?: string[];\n model?: string[];\n agent?: string[];\n command?: string[];\n project?: string[];\n branch?: string[];\n os?: string[];\n ci?: boolean;\n match?: 'any' | 'all';\n}\n\n/**\n * Raw parsed YAML frontmatter structure\n */\ninterface ParsedFrontmatter {\n globs?: unknown;\n keywords?: unknown;\n tools?: unknown;\n model?: unknown;\n agent?: unknown;\n command?: unknown;\n project?: unknown;\n branch?: unknown;\n os?: unknown;\n ci?: unknown;\n match?: unknown;\n}\n\n/** Field names in ParsedFrontmatter that are string arrays */\ntype StringArrayField =\n | 'globs'\n | 'keywords'\n | 'tools'\n | 'model'\n | 'agent'\n | 'command'\n | 'project'\n | 'branch'\n | 'os';\n\n/**\n * Extract and normalize a string array from parsed frontmatter.\n * Filters non-strings, trims whitespace, and removes empty values.\n *\n * @param value - Raw value from parsed YAML (may be array or undefined)\n * @returns Normalized string array, or undefined if empty after filtering\n */\nfunction extractStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const result = value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(v => v.length > 0);\n return result.length > 0 ? result : undefined;\n}\n\n/**\n * Parse YAML metadata from rule file content using the yaml package.\n * Extracts frontmatter (---) and returns metadata object.\n */\nexport function parseRuleMetadata(content: string): RuleMetadata | undefined {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return undefined;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return undefined;\n }\n\n // Extract the YAML frontmatter\n const frontmatter = content.substring(3, endIndex).trim();\n if (!frontmatter) {\n return undefined;\n }\n\n try {\n // Parse YAML using the yaml package\n const parsed = parseYaml(frontmatter) as ParsedFrontmatter | null;\n if (!parsed || typeof parsed !== 'object') {\n return undefined;\n }\n\n const metadata: RuleMetadata = {};\n\n // Array fields to extract using shared helper\n const arrayFields: StringArrayField[] = [\n 'globs',\n 'keywords',\n 'tools',\n 'model',\n 'agent',\n 'command',\n 'project',\n 'branch',\n 'os',\n ];\n\n for (const field of arrayFields) {\n const extracted = extractStringArray(parsed[field]);\n if (extracted) {\n metadata[field] = extracted;\n }\n }\n\n // Extract ci boolean (only if strictly boolean)\n if (typeof parsed.ci === 'boolean') {\n metadata.ci = parsed.ci;\n }\n\n // Extract match (normalize to 'any' | 'all' only)\n if (parsed.match === 'any' || parsed.match === 'all') {\n metadata.match = parsed.match;\n }\n\n // Return metadata only if it has content\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n } catch (error) {\n // Log warning for YAML parsing errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to parse YAML frontmatter: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Strip YAML frontmatter from rule content\n */\nexport function stripFrontmatter(content: string): string {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return content;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return content;\n }\n\n // Return content after the closing marker, trimming leading newline\n return content.substring(endIndex + 3).trimStart();\n}\n",
|
|
9
|
+
"/**\n * Rule metadata parsing and frontmatter extraction\n */\n\nconst { parse: parseYaml } = await import('yaml');\n\n/**\n * Metadata extracted from .mdc file frontmatter\n */\nexport interface RuleMetadata {\n globs?: string[];\n keywords?: string[];\n tools?: string[];\n model?: string[];\n agent?: string[];\n command?: string[];\n project?: string[];\n branch?: string[];\n os?: string[];\n ci?: boolean;\n match?: 'any' | 'all';\n /** Higher priority is kept first when a token budget is enforced. Default 0. */\n priority?: number;\n}\n\n/**\n * Raw parsed YAML frontmatter structure\n */\ninterface ParsedFrontmatter {\n globs?: unknown;\n keywords?: unknown;\n tools?: unknown;\n model?: unknown;\n agent?: unknown;\n command?: unknown;\n project?: unknown;\n branch?: unknown;\n os?: unknown;\n ci?: unknown;\n match?: unknown;\n priority?: unknown;\n}\n\n/** Field names in ParsedFrontmatter that are string arrays */\ntype StringArrayField =\n | 'globs'\n | 'keywords'\n | 'tools'\n | 'model'\n | 'agent'\n | 'command'\n | 'project'\n | 'branch'\n | 'os';\n\n/**\n * Extract and normalize a string array from parsed frontmatter.\n * Filters non-strings, trims whitespace, and removes empty values.\n *\n * @param value - Raw value from parsed YAML (may be array or undefined)\n * @returns Normalized string array, or undefined if empty after filtering\n */\nfunction extractStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const result = value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(v => v.length > 0);\n return result.length > 0 ? result : undefined;\n}\n\n/**\n * Parse YAML metadata from rule file content using the yaml package.\n * Extracts frontmatter (---) and returns metadata object.\n */\nexport function parseRuleMetadata(content: string): RuleMetadata | undefined {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return undefined;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return undefined;\n }\n\n // Extract the YAML frontmatter\n const frontmatter = content.substring(3, endIndex).trim();\n if (!frontmatter) {\n return undefined;\n }\n\n try {\n // Parse YAML using the yaml package\n const parsed = parseYaml(frontmatter) as ParsedFrontmatter | null;\n if (!parsed || typeof parsed !== 'object') {\n return undefined;\n }\n\n const metadata: RuleMetadata = {};\n\n // Array fields to extract using shared helper\n const arrayFields: StringArrayField[] = [\n 'globs',\n 'keywords',\n 'tools',\n 'model',\n 'agent',\n 'command',\n 'project',\n 'branch',\n 'os',\n ];\n\n for (const field of arrayFields) {\n const extracted = extractStringArray(parsed[field]);\n if (extracted) {\n metadata[field] = extracted;\n }\n }\n\n // Extract ci boolean (only if strictly boolean)\n if (typeof parsed.ci === 'boolean') {\n metadata.ci = parsed.ci;\n }\n\n // Extract match (normalize to 'any' | 'all' only)\n if (parsed.match === 'any' || parsed.match === 'all') {\n metadata.match = parsed.match;\n }\n\n // Extract priority (finite numbers only; non-finite or absent becomes undefined, treated as 0 downstream)\n if (typeof parsed.priority === 'number' && Number.isFinite(parsed.priority)) {\n metadata.priority = parsed.priority;\n }\n\n // Return metadata only if it has content\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n } catch (error) {\n // Log warning for YAML parsing errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to parse YAML frontmatter: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Strip YAML frontmatter from rule content\n */\nexport function stripFrontmatter(content: string): string {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return content;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return content;\n }\n\n // Return content after the closing marker, trimming leading newline\n return content.substring(endIndex + 3).trimStart();\n}\n",
|
|
10
10
|
"import * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { createDebugLog } from './debug.js';\n\nconst debugLog = createDebugLog();\n\nexport interface ActiveRulesState {\n sessionId: string;\n matchedRulePaths: string[];\n evaluatedAt: number;\n}\n\n// Per-session write queue to serialize concurrent writes\nconst writeQueues = new Map<string, Promise<void>>();\n\n// Allows tests to override the state directory\nlet stateDirOverride: string | null = null;\n\n// Strict pattern for safe sessionId: alphanumeric, underscore, hyphen only\nconst SAFE_SESSION_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\n\nfunction isValidSessionId(sessionId: string): boolean {\n return SAFE_SESSION_ID_PATTERN.test(sessionId);\n}\n\n/** @internal Test-only: override the state directory */\nexport function _setStateDirForTesting(dir: string | null): void {\n stateDirOverride = dir;\n}\n\nexport function resolveStateDir(): string {\n if (stateDirOverride !== null) {\n return stateDirOverride;\n }\n return path.join(os.homedir(), '.opencode', 'state', 'opencode-rules-md');\n}\n\nexport function getStateFilePath(sessionId: string): string {\n if (!isValidSessionId(sessionId)) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(resolveStateDir(), `${sessionId}.json`);\n}\n\nexport function writeActiveRulesState(\n sessionId: string,\n matchedPaths: string[]\n): void {\n if (!isValidSessionId(sessionId)) {\n debugLog(`Invalid sessionId rejected: ${sessionId}`);\n return;\n }\n\n const state: ActiveRulesState = {\n sessionId,\n matchedRulePaths: matchedPaths,\n evaluatedAt: Date.now(),\n };\n\n // Chain onto existing queue for this session, or start fresh\n const previousWrite = writeQueues.get(sessionId) ?? Promise.resolve();\n\n const currentWrite = previousWrite.then(async () => {\n await doAtomicWrite(sessionId, state);\n });\n\n writeQueues.set(sessionId, currentWrite);\n\n // Fire-and-forget: catch errors to prevent unhandled rejection\n currentWrite.catch(() => {\n // Errors already logged in doAtomicWrite\n });\n}\n\nasync function doAtomicWrite(\n sessionId: string,\n state: ActiveRulesState\n): Promise<void> {\n const stateDir = resolveStateDir();\n const finalPath = getStateFilePath(sessionId);\n const tempPath = path.join(\n stateDir,\n `.${sessionId}-${crypto.randomBytes(8).toString('hex')}.tmp`\n );\n\n try {\n // Ensure directory exists\n await fs.mkdir(stateDir, { recursive: true });\n\n // Write to temp file\n const content = JSON.stringify(state);\n await fs.writeFile(tempPath, content, 'utf-8');\n\n // Atomic rename\n await fs.rename(tempPath, finalPath);\n } catch (error) {\n debugLog(\n `Failed to write active rules state for session ${sessionId}: ${error}`\n );\n\n // Clean up temp file if it exists\n try {\n await fs.unlink(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\nexport async function readActiveRulesState(\n sessionId: string\n): Promise<ActiveRulesState | null> {\n if (!isValidSessionId(sessionId)) {\n debugLog(`Invalid sessionId rejected: ${sessionId}`);\n return null;\n }\n\n const filePath = getStateFilePath(sessionId);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n\n if (!isValidActiveRulesState(parsed)) {\n debugLog(`Invalid active rules state format for session ${sessionId}`);\n return null;\n }\n\n return parsed;\n } catch (error) {\n debugLog(\n `Failed to read active rules state for session ${sessionId}: ${error}`\n );\n return null;\n }\n}\n\nfunction isValidActiveRulesState(value: unknown): value is ActiveRulesState {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n if (typeof obj['sessionId'] !== 'string') {\n return false;\n }\n\n if (typeof obj['evaluatedAt'] !== 'number') {\n return false;\n }\n\n if (!Array.isArray(obj['matchedRulePaths'])) {\n return false;\n }\n\n for (const item of obj['matchedRulePaths']) {\n if (typeof item !== 'string') {\n return false;\n }\n }\n\n return true;\n}\n",
|
|
11
11
|
"// tui/data/rules.ts\nimport { discoverRuleFiles, getCachedRule } from '../../src/rule-discovery.js';\nimport type { RuleMetadata } from '../../src/rule-metadata.js';\nimport { readActiveRulesState } from '../../src/active-rules-state.js';\nimport path from 'path';\n\n/** Represents a rule as displayed in the sidebar */\nexport interface SidebarRuleEntry {\n /** Display name (filename stem, disambiguated if needed) */\n name: string;\n /** Relative file path from the rules directory root */\n path: string;\n /** Whether this rule came from global or project-local rules dir */\n source: 'global' | 'project';\n /** Whether the rule has any conditional metadata */\n isConditional: boolean;\n /** Human-readable condition summary */\n conditionSummary: string;\n /** Full metadata for expanded view */\n metadata: RuleMetadata;\n /**\n * Active state of the rule.\n * - true: rule is active (matched by evaluation or unconditional without state file)\n * - false: rule is not active (not matched by evaluation)\n * - null: state not yet determined (conditional rule without state file)\n */\n isActive: boolean | null;\n}\n\nexport interface LoadSidebarRulesResult {\n rules: SidebarRuleEntry[];\n skippedCount: number;\n /** Whether active rules state was successfully read from disk */\n hasEvaluationState: boolean;\n}\n\n/**\n * Load all discovered rules formatted for sidebar display.\n * Reuses discoverRuleFiles/getCachedRule from the server plugin.\n *\n * @param projectDir - Project directory or null (global rules only)\n * @param sessionId - Optional session ID to read active rules state\n */\nexport async function loadSidebarRules(\n projectDir: string | null,\n sessionId?: string\n): Promise<LoadSidebarRulesResult> {\n // discoverRuleFiles accepts string | undefined, not null\n const discovered = await discoverRuleFiles(projectDir ?? undefined);\n\n // Read active rules state if sessionId provided\n const activeState = sessionId ? await readActiveRulesState(sessionId) : null;\n const hasEvaluationState = activeState !== null;\n const matchedPathsSet = hasEvaluationState\n ? new Set(activeState.matchedRulePaths)\n : null;\n\n const entries: SidebarRuleEntry[] = [];\n let skippedCount = 0;\n\n for (const rule of discovered) {\n const cached = await getCachedRule(rule.filePath);\n if (!cached) {\n // getCachedRule() already logs a warning for read failures,\n // so we only increment the counter here — no duplicate log.\n skippedCount++;\n continue;\n }\n\n const meta = cached.metadata;\n const source = ruleSource(rule.filePath, projectDir);\n const isConditional = hasConditions(meta);\n const conditionSummary = isConditional\n ? formatConditionSummary(meta!)\n : 'always active';\n\n // Determine isActive based on state file or fallback logic\n let isActive: boolean | null;\n if (matchedPathsSet !== null) {\n // With state file: check if this rule's absolute path is in matchedPaths\n isActive = matchedPathsSet.has(rule.filePath);\n } else {\n // Without state file: unconditional = true, conditional = null\n isActive = isConditional ? null : true;\n }\n\n entries.push({\n name: '', // placeholder — set in disambiguation pass\n path: rule.relativePath,\n source,\n isConditional,\n conditionSummary,\n metadata: meta ?? {},\n isActive,\n });\n }\n\n disambiguateNames(entries);\n\n // Sort: project first, then global. Active rules to top, then alpha by name.\n const activeOrder = (v: boolean | null): number =>\n v === true ? 0 : v === null ? 1 : 2;\n entries.sort((a, b) => {\n if (a.source !== b.source) return a.source === 'project' ? -1 : 1;\n const activeCmp = activeOrder(a.isActive) - activeOrder(b.isActive);\n if (activeCmp !== 0) return activeCmp;\n const nameCompare = a.name.localeCompare(b.name);\n if (nameCompare !== 0) return nameCompare;\n return a.path.localeCompare(b.path);\n });\n\n return { rules: entries, skippedCount, hasEvaluationState };\n}\n\n/**\n * Determine if a rule file is project-local or global.\n * Uses path.sep boundary check to avoid matching partial prefixes\n * (e.g., /project/.opencode/rules-extra/ should not match).\n */\nexport function ruleSource(\n filePath: string,\n projectDir: string | null\n): 'global' | 'project' {\n if (!projectDir) return 'global';\n const projectRulesPrefix =\n path.join(projectDir, '.opencode', 'rules') + path.sep;\n return filePath.startsWith(projectRulesPrefix) ? 'project' : 'global';\n}\n\n/**\n * Check if metadata has any conditional fields set.\n */\nexport function hasConditions(meta: RuleMetadata | undefined): boolean {\n if (!meta) return false;\n return !!(\n meta.globs ||\n meta.keywords ||\n meta.tools ||\n meta.model ||\n meta.agent ||\n meta.command ||\n meta.project ||\n meta.branch ||\n meta.os ||\n meta.ci !== undefined\n );\n}\n\n/**\n * Build a human-readable, comma-separated summary of active conditions.\n * E.g., \"globs: src/*.ts, keywords: auth, security\"\n */\nexport function formatConditionSummary(meta: RuleMetadata): string {\n const parts: string[] = [];\n\n const arrayFields: Array<[keyof RuleMetadata, string]> = [\n ['globs', 'globs'],\n ['keywords', 'keywords'],\n ['tools', 'tools'],\n ['model', 'model'],\n ['agent', 'agent'],\n ['command', 'command'],\n ['project', 'project'],\n ['branch', 'branch'],\n ['os', 'os'],\n ];\n\n for (const [field, label] of arrayFields) {\n const value = meta[field];\n if (Array.isArray(value) && value.length > 0) {\n parts.push(`${label}: ${(value as string[]).join(', ')}`);\n }\n }\n\n if (meta.ci !== undefined) {\n parts.push(`ci: ${String(meta.ci)}`);\n }\n\n if (meta.match) {\n parts.push(`match: ${meta.match}`);\n }\n\n return parts.join(', ');\n}\n\n/**\n * Three-pass name disambiguation.\n * Pass 1: Extract filename stem from each entry's path.\n * Pass 2: For duplicate stems, prefix with parent directory.\n * Pass 3: If still ambiguous (same parent or root-level), use full relative\n * path (including extension) as the display name.\n *\n * Mutates entries[].name in place.\n */\nexport function disambiguateNames(entries: SidebarRuleEntry[]): void {\n // Pass 1: assign stem names (filename without extension, using last dot)\n for (const entry of entries) {\n const basename = path.basename(entry.path);\n const dotIndex = basename.lastIndexOf('.');\n entry.name = dotIndex > 0 ? basename.substring(0, dotIndex) : basename;\n }\n\n // Pass 2: detect and resolve collisions with parent directory prefix\n const stemCounts = new Map<string, number>();\n for (const entry of entries) {\n stemCounts.set(entry.name, (stemCounts.get(entry.name) ?? 0) + 1);\n }\n\n for (const entry of entries) {\n if ((stemCounts.get(entry.name) ?? 0) <= 1) continue;\n\n const dir = path.dirname(entry.path);\n if (dir && dir !== '.') {\n const parent = path.basename(dir);\n entry.name = `${parent}/${entry.name}`;\n }\n }\n\n // Pass 3: if still ambiguous, use full relative path WITH extension\n const nameCounts = new Map<string, number>();\n for (const entry of entries) {\n nameCounts.set(entry.name, (nameCounts.get(entry.name) ?? 0) + 1);\n }\n\n for (const entry of entries) {\n if ((nameCounts.get(entry.name) ?? 0) > 1) {\n entry.name = entry.path;\n }\n }\n}\n"
|
|
12
12
|
],
|
|
13
|
-
"mappings": ";;;;AAAA,4BAAS;;;ACAT,4BAAS;AACT,mBAAS;AACT,2BAAS;AACT,uBAAS;AACT,mBAAS;AACT,iBAAS;AACT,oBAAS;AACT,0BAAS;AAGT;;;ACNA;AACA;AACA;;;ACJO,SAAS,cAAc,CAAC,SAAS,uBAAiC;AAAA,EACvE,OAAO,CAAC,YAA0B;AAAA,IAChC,IAAI,QAAQ,IAAI,sBAAsB;AAAA,MACpC,QAAQ,MAAM,GAAG,UAAU,SAAS;AAAA,IACtC;AAAA;AAAA;;;ACFJ,MAAQ,OAAO,cAAc,MAAa;AAuD1C,SAAS,kBAAkB,CAAC,OAAsC;AAAA,EAChE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,IACzB;AAAA,EACF;AAAA,EACA,MAAM,SAAS,MACZ,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,EAChD,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,EAC3B,OAAO,OAAO,SAAS,IAAI,SAAS;AAAA;AAO/B,SAAS,iBAAiB,CAAC,SAA2C;AAAA,EAE3E,IAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAAA,IAC9B;AAAA,EACF;AAAA,EAGA,MAAM,WAAW,QAAQ,QAAQ,OAAO,CAAC;AAAA,EACzC,IAAI,aAAa,IAAI;AAAA,IACnB;AAAA,EACF;AAAA,EAGA,MAAM,cAAc,QAAQ,UAAU,GAAG,QAAQ,EAAE,KAAK;AAAA,EACxD,IAAI,CAAC,aAAa;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,IAEF,MAAM,SAAS,UAAU,WAAW;AAAA,IACpC,IAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AAAA,MACzC;AAAA,IACF;AAAA,IAEA,MAAM,WAAyB,CAAC;AAAA,IAGhC,MAAM,cAAkC;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA,WAAW,SAAS,aAAa;AAAA,MAC/B,MAAM,YAAY,mBAAmB,OAAO,MAAM;AAAA,MAClD,IAAI,WAAW;AAAA,QACb,SAAS,SAAS;AAAA,MACpB;AAAA,IACF;AAAA,IAGA,IAAI,OAAO,OAAO,OAAO,WAAW;AAAA,MAClC,SAAS,KAAK,OAAO;AAAA,IACvB;AAAA,IAGA,IAAI,OAAO,UAAU,SAAS,OAAO,UAAU,OAAO;AAAA,MACpD,SAAS,QAAQ,OAAO;AAAA,IAC1B;AAAA,IAGA,OAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AAAA,IACrD,OAAO,OAAO;AAAA,IAEd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACrE,QAAQ,KACN,kEAAkE,SACpE;AAAA,IACA;AAAA;AAAA;AAOG,SAAS,gBAAgB,CAAC,SAAyB;AAAA,EAExD,IAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,WAAW,QAAQ,QAAQ,OAAO,CAAC;AAAA,EACzC,IAAI,aAAa,IAAI;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EAGA,OAAO,QAAQ,UAAU,WAAW,CAAC,EAAE,UAAU;AAAA;;;AFjJnD,IAAM,WAAW,eAAe;AAmBhC,IAAM,YAAY,IAAI;AAgBtB,eAAsB,aAAa,CACjC,UACiC;AAAA,EACjC,IAAI;AAAA,IACF,MAAM,QAAQ,MAAM,KAAK,QAAQ;AAAA,IACjC,MAAM,QAAQ,MAAM;AAAA,IAGpB,MAAM,SAAS,UAAU,IAAI,QAAQ;AAAA,IACrC,IAAI,UAAU,OAAO,UAAU,OAAO;AAAA,MACpC,SAAS,cAAc,UAAU;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IAGA,SAAS,eAAe,UAAU;AAAA,IAClC,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAAA,IAChD,MAAM,WAAW,kBAAkB,OAAO;AAAA,IAC1C,MAAM,kBAAkB,iBAAiB,OAAO;AAAA,IAEhD,MAAM,QAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA,UAAU,IAAI,UAAU,KAAK;AAAA,IAC7B,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IAEd,UAAU,OAAO,QAAQ;AAAA,IACzB,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACrE,QAAQ,KACN,yDAAyD,aAAa,SACxE;AAAA,IACA;AAAA;AAAA;AAOJ,SAAS,iBAAiB,GAAkB;AAAA,EAC1C,MAAM,oBAAoB,QAAQ,IAAI;AAAA,EACtC,IAAI,mBAAmB;AAAA,IACrB,OAAO,KAAK,KAAK,mBAAmB,OAAO;AAAA,EAC7C;AAAA,EAEA,MAAM,gBAAgB,QAAQ,IAAI;AAAA,EAClC,IAAI,eAAe;AAAA,IACjB,OAAO,KAAK,KAAK,eAAe,YAAY,OAAO;AAAA,EACrD;AAAA,EAEA,MAAM,UAAU,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAAA,EAC/C,OAAO,KAAK,KAAK,SAAS,WAAW,YAAY,OAAO;AAAA;AAU1D,eAAe,wBAAwB,CACrC,KACA,SAC4D;AAAA,EAC5D,MAAM,UAA6D,CAAC;AAAA,EAEpE,IAAI;AAAA,IACF,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IAC1D,WAAW,SAAS,SAAS;AAAA,MAE3B,IAAI,MAAM,KAAK,WAAW,GAAG,GAAG;AAAA,QAC9B;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAAA,MAE1C,IAAI,MAAM,YAAY,GAAG;AAAA,QAEvB,QAAQ,KAAK,GAAI,MAAM,yBAAyB,UAAU,OAAO,CAAE;AAAA,MACrE,EAAO,SAAI,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,MAAM,GAAG;AAAA,QAEpE,MAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AAAA,QACpD,QAAQ,KAAK,EAAE,UAAU,UAAU,aAAa,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,IACA,OAAO,OAAO;AAAA,IAEd,IAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAAU;AAAA,MACxE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACrE,QAAQ,KACN,yDAAyD,QAAQ,SACnE;AAAA;AAAA,EAGF,OAAO;AAAA;AAqBT,eAAsB,iBAAiB,CACrC,YAC2B;AAAA,EAC3B,MAAM,QAA0B,CAAC;AAAA,EAGjC,MAAM,iBAAiB,kBAAkB;AAAA,EACzC,IAAI,gBAAgB;AAAA,IAClB,MAAM,cAAc,MAAM,yBACxB,gBACA,cACF;AAAA,IACA,aAAa,UAAU,kBAAkB,aAAa;AAAA,MACpD,SAAS,2BAA2B,iBAAiB,WAAW;AAAA,MAChE,MAAM,KAAK,EAAE,UAAU,aAAa,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EAGA,IAAI,YAAY;AAAA,IACd,MAAM,kBAAkB,KAAK,KAAK,YAAY,aAAa,OAAO;AAAA,IAClE,MAAM,eAAe,MAAM,yBACzB,iBACA,eACF;AAAA,IACA,aAAa,UAAU,kBAAkB,cAAc;AAAA,MACrD,SAAS,4BAA4B,iBAAiB,WAAW;AAAA,MACjE,MAAM,KAAK,EAAE,UAAU,aAAa,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;;AG3MT;AACA;AACA;AAIA,IAAM,YAAW,eAAe;AAShC,IAAM,cAAc,IAAI;AAGxB,IAAI,mBAAkC;AAGtC,IAAM,0BAA0B;AAEhC,SAAS,gBAAgB,CAAC,WAA4B;AAAA,EACpD,OAAO,wBAAwB,KAAK,SAAS;AAAA;AAQxC,SAAS,eAAe,GAAW;AAAA,EACxC,IAAI,qBAAqB,MAAM;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,OAAY,WAAQ,YAAQ,GAAG,aAAa,SAAS,mBAAmB;AAAA;AAGnE,SAAS,gBAAgB,CAAC,WAA2B;AAAA,EAC1D,IAAI,CAAC,iBAAiB,SAAS,GAAG;AAAA,IAChC,MAAM,IAAI,MAAM,sBAAsB,WAAW;AAAA,EACnD;AAAA,EACA,OAAY,WAAK,gBAAgB,GAAG,GAAG,gBAAgB;AAAA;AAoEzD,eAAsB,oBAAoB,CACxC,WACkC;AAAA,EAClC,IAAI,CAAC,iBAAiB,SAAS,GAAG;AAAA,IAChC,UAAS,+BAA+B,WAAW;AAAA,IACnD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,iBAAiB,SAAS;AAAA,EAE3C,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAS,UAAU,OAAO;AAAA,IACnD,MAAM,SAAkB,KAAK,MAAM,OAAO;AAAA,IAE1C,IAAI,CAAC,wBAAwB,MAAM,GAAG;AAAA,MACpC,UAAS,iDAAiD,WAAW;AAAA,MACrE,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,UACE,iDAAiD,cAAc,OACjE;AAAA,IACA,OAAO;AAAA;AAAA;AAIX,SAAS,uBAAuB,CAAC,OAA2C;AAAA,EAC1E,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAAA,IAC/C,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM;AAAA,EAEZ,IAAI,OAAO,IAAI,iBAAiB,UAAU;AAAA,IACxC,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAO,IAAI,mBAAmB,UAAU;AAAA,IAC1C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,CAAC,MAAM,QAAQ,IAAI,mBAAmB,GAAG;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAQ,IAAI,qBAAqB;AAAA,IAC1C,IAAI,OAAO,SAAS,UAAU;AAAA,MAC5B,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;;AChKT;AAuCA,eAAsB,gBAAgB,CACpC,YACA,WACiC;AAAA,EAEjC,MAAM,aAAa,MAAM,kBAAkB,cAAc,SAAS;AAAA,EAGlE,MAAM,cAAc,YAAY,MAAM,qBAAqB,SAAS,IAAI;AAAA,EACxE,MAAM,qBAAqB,gBAAgB;AAAA,EAC3C,MAAM,kBAAkB,qBACpB,IAAI,IAAI,YAAY,gBAAgB,IACpC;AAAA,EAEJ,MAAM,UAA8B,CAAC;AAAA,EACrC,IAAI,eAAe;AAAA,EAEnB,WAAW,QAAQ,YAAY;AAAA,IAC7B,MAAM,SAAS,MAAM,cAAc,KAAK,QAAQ;AAAA,IAChD,IAAI,CAAC,QAAQ;AAAA,MAGX;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,OAAO;AAAA,IACpB,MAAM,SAAS,WAAW,KAAK,UAAU,UAAU;AAAA,IACnD,MAAM,gBAAgB,cAAc,IAAI;AAAA,IACxC,MAAM,mBAAmB,gBACrB,uBAAuB,IAAK,IAC5B;AAAA,IAGJ,IAAI;AAAA,IACJ,IAAI,oBAAoB,MAAM;AAAA,MAE5B,WAAW,gBAAgB,IAAI,KAAK,QAAQ;AAAA,IAC9C,EAAO;AAAA,MAEL,WAAW,gBAAgB,OAAO;AAAA;AAAA,IAGpC,QAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,QAAQ,CAAC;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB,OAAO;AAAA,EAGzB,MAAM,cAAc,CAAC,MACnB,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI;AAAA,EACpC,QAAQ,KAAK,CAAC,GAAG,MAAM;AAAA,IACrB,IAAI,EAAE,WAAW,EAAE;AAAA,MAAQ,OAAO,EAAE,WAAW,YAAY,KAAK;AAAA,IAChE,MAAM,YAAY,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ;AAAA,IAClE,IAAI,cAAc;AAAA,MAAG,OAAO;AAAA,IAC5B,MAAM,cAAc,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IAC/C,IAAI,gBAAgB;AAAA,MAAG,OAAO;AAAA,IAC9B,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,GACnC;AAAA,EAED,OAAO,EAAE,OAAO,SAAS,cAAc,mBAAmB;AAAA;AAQrD,SAAS,UAAU,CACxB,UACA,YACsB;AAAA,EACtB,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EACxB,MAAM,qBACJ,MAAK,KAAK,YAAY,aAAa,OAAO,IAAI,MAAK;AAAA,EACrD,OAAO,SAAS,WAAW,kBAAkB,IAAI,YAAY;AAAA;AAMxD,SAAS,aAAa,CAAC,MAAyC;AAAA,EACrE,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,OAAO,CAAC,EACN,KAAK,SACL,KAAK,YACL,KAAK,SACL,KAAK,SACL,KAAK,SACL,KAAK,WACL,KAAK,WACL,KAAK,UACL,KAAK,MACL,KAAK,OAAO;AAAA;AAQT,SAAS,sBAAsB,CAAC,MAA4B;AAAA,EACjE,MAAM,QAAkB,CAAC;AAAA,EAEzB,MAAM,cAAmD;AAAA,IACvD,CAAC,SAAS,OAAO;AAAA,IACjB,CAAC,YAAY,UAAU;AAAA,IACvB,CAAC,SAAS,OAAO;AAAA,IACjB,CAAC,SAAS,OAAO;AAAA,IACjB,CAAC,SAAS,OAAO;AAAA,IACjB,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,UAAU,QAAQ;AAAA,IACnB,CAAC,MAAM,IAAI;AAAA,EACb;AAAA,EAEA,YAAY,OAAO,UAAU,aAAa;AAAA,IACxC,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,MAC5C,MAAM,KAAK,GAAG,UAAW,MAAmB,KAAK,IAAI,GAAG;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,IAAI,KAAK,OAAO,WAAW;AAAA,IACzB,MAAM,KAAK,OAAO,OAAO,KAAK,EAAE,GAAG;AAAA,EACrC;AAAA,EAEA,IAAI,KAAK,OAAO;AAAA,IACd,MAAM,KAAK,UAAU,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,OAAO,MAAM,KAAK,IAAI;AAAA;AAYjB,SAAS,iBAAiB,CAAC,SAAmC;AAAA,EAEnE,WAAW,SAAS,SAAS;AAAA,IAC3B,MAAM,WAAW,MAAK,SAAS,MAAM,IAAI;AAAA,IACzC,MAAM,WAAW,SAAS,YAAY,GAAG;AAAA,IACzC,MAAM,OAAO,WAAW,IAAI,SAAS,UAAU,GAAG,QAAQ,IAAI;AAAA,EAChE;AAAA,EAGA,MAAM,aAAa,IAAI;AAAA,EACvB,WAAW,SAAS,SAAS;AAAA,IAC3B,WAAW,IAAI,MAAM,OAAO,WAAW,IAAI,MAAM,IAAI,KAAK,KAAK,CAAC;AAAA,EAClE;AAAA,EAEA,WAAW,SAAS,SAAS;AAAA,IAC3B,KAAK,WAAW,IAAI,MAAM,IAAI,KAAK,MAAM;AAAA,MAAG;AAAA,IAE5C,MAAM,MAAM,MAAK,QAAQ,MAAM,IAAI;AAAA,IACnC,IAAI,OAAO,QAAQ,KAAK;AAAA,MACtB,MAAM,SAAS,MAAK,SAAS,GAAG;AAAA,MAChC,MAAM,OAAO,GAAG,UAAU,MAAM;AAAA,IAClC;AAAA,EACF;AAAA,EAGA,MAAM,aAAa,IAAI;AAAA,EACvB,WAAW,SAAS,SAAS;AAAA,IAC3B,WAAW,IAAI,MAAM,OAAO,WAAW,IAAI,MAAM,IAAI,KAAK,KAAK,CAAC;AAAA,EAClE;AAAA,EAEA,WAAW,SAAS,SAAS;AAAA,IAC3B,KAAK,WAAW,IAAI,MAAM,IAAI,KAAK,KAAK,GAAG;AAAA,MACzC,MAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA;;;ALxNF,SAAS,WAAW,CAAC,OAAO;AAAA,EAC1B,MAAM,cAAc,WAAW,MAAM,MAAM,MAAM,OAAO,OAAK,EAAE,aAAa,IAAI,EAAE,MAAM;AAAA,EACxF,MAAM,cAAc,WAAW,MAAM;AAAA,IACnC,IAAI,MAAM,oBAAoB;AAAA,MAC5B,OAAO,IAAI,YAAY,KAAK,MAAM,MAAM;AAAA,IAC1C;AAAA,IACA,OAAO,IAAI,MAAM,MAAM;AAAA,GACxB;AAAA,EACD,MAAM,cAAc,UAAQ;AAAA,IAC1B,OAAO,KAAK,aAAa,OAAO,MAAM,MAAM,UAAU,MAAM,MAAM;AAAA;AAAA,EAEpE,OAAO,kBAAkB,MAAM;AAAA,QACzB,IAAI,GAAG;AAAA,MACT,OAAO,MAAM,MAAM,SAAS;AAAA;AAAA,QAE1B,QAAQ,GAAG;AAAA,MACb,IAAI,OAAO,gBAAgB,KAAK,GAC9B,QAAQ,gBAAgB,KAAK,GAC7B,QAAQ,gBAAgB,MAAM,GAC9B,QAAQ,gBAAgB,MAAM;AAAA,MAChC,aAAa,MAAM,KAAK;AAAA,MACxB,aAAa,OAAO,KAAK;AAAA,MACzB,aAAa,OAAO,KAAK;AAAA,MACzB,UAAU,OAAO,iBAAiB,KAAK;AAAA,MACvC,UAAU,OAAO,OAAO,CAAC;AAAA,MACzB,UAAU,OAAO,eAAe,MAAM,MAAM,SAAS,CAAC;AAAA,MACtD,SAAS,OAAO,MAAM,MAAM,OAAO,WAAK,QAAG;AAAA,MAC3C,SAAS,OAAO,MAAM,MAAM,OAAO,IAAI;AAAA,MACvC,SAAS,OAAO,kBAAkB,MAAM;AAAA,YAClC,IAAI,GAAG;AAAA,UACT,OAAO,CAAC,MAAM;AAAA;AAAA,YAEZ,QAAQ,GAAG;AAAA,UACb,IAAI,QAAQ,gBAAgB,MAAM,GAChC,QAAQ,iBAAiB,GAAG;AAAA,UAC9B,aAAa,OAAO,KAAK;AAAA,UACzB,SAAS,OAAO,aAAa,IAAI;AAAA,UACjC,SAAS,SAAO,UAAU,OAAO,SAAS;AAAA,YACxC,IAAI,MAAM,MAAM;AAAA,UAClB,GAAG,GAAG,CAAC;AAAA,UACP,OAAO;AAAA;AAAA,MAEX,CAAC,GAAG,IAAI;AAAA,MACR,SAAS,MAAM,kBAAkB,MAAM;AAAA,YACjC,IAAI,GAAG;AAAA,UACT,OAAO,MAAM;AAAA;AAAA,YAEX,QAAQ,GAAG;AAAA,UACb,OAAO,kBAAkB,KAAK;AAAA,gBACxB,IAAI,GAAG;AAAA,cACT,OAAO,MAAM;AAAA;AAAA,YAEf,UAAU,CAAC,MAAM,eAAe;AAAA,cAC9B,MAAM,cAAc,MAAM,MAAM,eAAe,WAAW;AAAA,cAC1D,QAAQ,MAAM;AAAA,gBACZ,IAAI,QAAQ,gBAAgB,KAAK,GAC/B,QAAQ,gBAAgB,KAAK,GAC7B,QAAQ,gBAAgB,MAAM,GAC9B,QAAQ,gBAAgB,MAAM;AAAA,gBAChC,aAAa,OAAO,KAAK;AAAA,gBACzB,UAAU,OAAO,iBAAiB,QAAQ;AAAA,gBAC1C,UAAU,OAAO,eAAe,MAAM,MAAM,eAAe,YAAY,CAAC,CAAC;AAAA,gBACzE,aAAa,OAAO,KAAK;AAAA,gBACzB,aAAa,OAAO,KAAK;AAAA,gBACzB,UAAU,OAAO,iBAAiB,KAAK;AAAA,gBACvC,UAAU,OAAO,OAAO,CAAC;AAAA,gBACzB,aAAa,OAAO,iBAAiB,QAAE,CAAC;AAAA,gBACxC,SAAS,OAAO,MAAM,KAAK,IAAI;AAAA,gBAC/B,SAAS,OAAO,kBAAkB,MAAM;AAAA,sBAClC,IAAI,GAAG;AAAA,oBACT,OAAO,MAAM,kBAAkB,YAAY;AAAA;AAAA,sBAEzC,QAAQ,GAAG;AAAA,oBACb,IAAI,SAAS,gBAAgB,KAAK,GAChC,SAAS,gBAAgB,MAAM;AAAA,oBACjC,aAAa,QAAQ,MAAM;AAAA,oBAC3B,UAAU,QAAQ,iBAAiB,QAAQ;AAAA,oBAC3C,UAAU,QAAQ,eAAe,CAAC;AAAA,oBAClC,SAAS,QAAQ,MAAM,KAAK,IAAI;AAAA,oBAChC,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,OAAO,UAAU,KAAK;AAAA;AAAA,0BAE1C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,SAAS;AAAA,wBACrC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,MAAM,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC3D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,UAAU,UAAU,KAAK;AAAA;AAAA,0BAE7C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,YAAY;AAAA,wBACxC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,SAAS,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC9D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,OAAO,UAAU,KAAK;AAAA;AAAA,0BAE1C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,SAAS;AAAA,wBACrC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,MAAM,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC3D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,OAAO,UAAU,KAAK;AAAA;AAAA,0BAE1C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,SAAS;AAAA,wBACrC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,MAAM,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC3D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,OAAO,UAAU,KAAK;AAAA;AAAA,0BAE1C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,SAAS;AAAA,wBACrC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,MAAM,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC3D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,SAAS,UAAU,KAAK;AAAA;AAAA,0BAE5C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,WAAW;AAAA,wBACvC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,QAAQ,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC7D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,SAAS,UAAU,KAAK;AAAA;AAAA,0BAE5C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,WAAW;AAAA,wBACvC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,QAAQ,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC7D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,QAAQ,UAAU,KAAK;AAAA;AAAA,0BAE3C,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,UAAU;AAAA,wBACtC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK,IAAI,GAAG,IAAI;AAAA,wBAC5D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,QAAQ,KAAK,SAAS,IAAI,UAAU,KAAK;AAAA;AAAA,0BAEvC,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,MAAM;AAAA,wBAClC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,GAAG,KAAK,IAAI,GAAG,IAAI;AAAA,wBACxD,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,OAAO,KAAK,SAAS,OAAO;AAAA;AAAA,0BAE1B,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,MAAM;AAAA,wBAClC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,OAAO,KAAK,SAAS,EAAE,GAAG,IAAI;AAAA,wBACrD,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,0BACnC,IAAI,GAAG;AAAA,wBACT,OAAO,KAAK,SAAS;AAAA;AAAA,0BAEnB,QAAQ,GAAG;AAAA,wBACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,SAAS;AAAA,wBACrC,aAAa,QAAQ,MAAM;AAAA,wBAC3B,SAAS,QAAQ,MAAM,KAAK,SAAS,OAAO,IAAI;AAAA,wBAChD,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,wBACnE,OAAO;AAAA;AAAA,oBAEX,CAAC,GAAG,IAAI;AAAA,oBACR,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,oBACnE,OAAO;AAAA;AAAA,gBAEX,CAAC,GAAG,IAAI;AAAA,gBACR,SAAS,SAAO;AAAA,kBACd,IAAI,OAAO,YAAY,IAAI,GACzB,OAAO,MAAM,MAAM;AAAA,kBACrB,SAAS,IAAI,MAAM,IAAI,IAAI,UAAU,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,kBAC7D,SAAS,IAAI,MAAM,IAAI,IAAI,UAAU,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,kBAC7D,OAAO;AAAA,mBACN;AAAA,kBACD,GAAG;AAAA,kBACH,GAAG;AAAA,gBACL,CAAC;AAAA,gBACD,OAAO;AAAA,iBACN;AAAA;AAAA,UAEP,CAAC;AAAA;AAAA,MAEL,CAAC,GAAG,IAAI;AAAA,MACR,SAAS,SAAO;AAAA,QACd,IAAI,MAAM,MAAM,MAAM,MACpB,OAAO,MAAM,MAAM;AAAA,QACrB,QAAQ,IAAI,MAAM,IAAI,IAAI,UAAU,OAAO,MAAM,KAAK,IAAI,CAAC;AAAA,QAC3D,SAAS,IAAI,MAAM,IAAI,IAAI,UAAU,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,QAC7D,OAAO;AAAA,SACN;AAAA,QACD,GAAG;AAAA,QACH,GAAG;AAAA,MACL,CAAC;AAAA,MACD,OAAO;AAAA;AAAA,EAEX,CAAC;AAAA;AAEI,SAAS,cAAc,CAAC,OAAO;AAAA,EACpC,OAAO,OAAO,YAAY,aAAa,CAAC,CAAC;AAAA,EACzC,OAAO,QAAQ,aAAa,aAAa,SAAS;AAAA,EAClD,OAAO,cAAc,mBAAmB,aAAa,CAAC;AAAA,EACtD,OAAO,oBAAoB,yBAAyB,aAAa,KAAK;AAAA,EACtE,OAAO,eAAe,oBAAoB,aAAa,IAAI;AAAA,EAC3D,OAAO,SAAS,cAAc,aAAa,SAAS;AAAA,EACpD,OAAO,eAAe,oBAAoB,aAAa,SAAS;AAAA,EAChE,OAAO,aAAa,kBAAkB,aAAa,KAAK;AAAA,EACxD,OAAO,YAAY,iBAAiB,aAAa,KAAK;AAAA,EACtD,OAAO,gBAAgB,qBAAqB,aAAa,CAAC;AAAA,EAC1D,MAAM,QAAQ,MAAM,MAAM,MAAM;AAAA,EAChC,MAAM,oBAAoB,MAAM;AAAA,IAC9B,OAAO,MAAM,IAAI,MAAM,KAAK,aAAa;AAAA;AAAA,EAI3C,IAAI,YAAY;AAAA,EAEhB,IAAI,gBAAgB;AAAA,EAGpB,MAAM,mBAAmB,YAAY;AAAA,IACnC,MAAM,cAAc,EAAE;AAAA,IACtB,MAAM,MAAM,kBAAkB;AAAA,IAC9B,MAAM,YAAY,MAAM;AAAA,IACxB,WAAW,GAAG;AAAA,IACd,iBAAiB,SAAS;AAAA,IAC1B,UAAU,SAAS;AAAA,IACnB,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,iBAAiB,KAAK,SAAS;AAAA,MAEpD,IAAI,cAAc;AAAA,QAAa;AAAA,MAC/B,SAAS,OAAO,KAAK;AAAA,MACrB,gBAAgB,OAAO,YAAY;AAAA,MACnC,sBAAsB,OAAO,kBAAkB;AAAA,MAC/C,UAAU,QAAQ;AAAA,MAClB,OAAO,KAAK;AAAA,MAEZ,IAAI,cAAc;AAAA,QAAa;AAAA,MAC/B,QAAQ,MAAM,6CAA6C,GAAG;AAAA,MAC9D,UAAU,OAAO;AAAA;AAAA;AAAA,EAKrB,MAAM,mBAAmB,YAAY;AAAA,IAEnC,IAAI,OAAO,MAAM;AAAA,MAAW;AAAA,IAC5B,MAAM,cAAc,EAAE;AAAA,IACtB,MAAM,MAAM,kBAAkB;AAAA,IAC9B,MAAM,YAAY,MAAM;AAAA,IACxB,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,iBAAiB,KAAK,SAAS;AAAA,MAEpD,IAAI,cAAc;AAAA,QAAa;AAAA,MAC/B,SAAS,OAAO,KAAK;AAAA,MACrB,gBAAgB,OAAO,YAAY;AAAA,MACnC,sBAAsB,OAAO,kBAAkB;AAAA,MAC/C,UAAU,QAAQ;AAAA,MAClB,OAAO,KAAK;AAAA,MAEZ,IAAI,cAAc;AAAA,QAAa;AAAA,MAC/B,QAAQ,MAAM,gDAAgD,GAAG;AAAA;AAAA;AAAA,EAKrE,aAAa,MAAM;AAAA,IACjB,MAAM,mBAAmB,MAAM;AAAA,IAC/B,MAAM,aAAa,kBAAkB;AAAA,IAGrC,IAAI,qBAAqB,cAAc,KAAK,eAAe,QAAQ,GAAG;AAAA,MAEpE,IAAI,kBAAkB,MAAM;AAAA,QAC1B,aAAa,aAAa;AAAA,QAC1B,gBAAgB;AAAA,MAClB;AAAA,MAEA,iBAAiB,IAAI;AAAA,MACrB,eAAe,KAAK;AAAA,MACpB,cAAc,KAAK;AAAA,MACd,iBAAiB;AAAA,IACxB;AAAA,GACD;AAAA,EAGD,aAAa,MAAM;AAAA,IACjB,MAAM,UAAU,eAAe;AAAA,IAC/B,IAAI,UAAU,GAAG;AAAA,MACV,iBAAiB;AAAA,IACxB;AAAA,GACD;AAAA,EAGD,MAAM,iBAAiB,WAAS;AAAA,IAG9B,MAAM,iBAAiB,MAAM,WAAW;AAAA,IACxC,IAAI,OAAO,mBAAmB,YAAY,mBAAmB,MAAM,WAAW;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,IAAI,kBAAkB,MAAM;AAAA,MAC1B,aAAa,aAAa;AAAA,IAC5B;AAAA,IACA,gBAAgB,WAAW,MAAM;AAAA,MAC/B,gBAAgB;AAAA,MAChB,kBAAkB,OAAK,IAAI,CAAC;AAAA,OAC3B,GAAG;AAAA;AAAA,EAER,MAAM,sBAAsB,MAAM,IAAI,MAAM,GAAG,mBAAmB,cAAc;AAAA,EAChF,MAAM,qBAAqB,MAAM,IAAI,MAAM,GAAG,kBAAkB,cAAc;AAAA,EAC9E,UAAU,MAAM;AAAA,IACd,IAAI,kBAAkB,MAAM;AAAA,MAC1B,aAAa,aAAa;AAAA,IAC5B;AAAA,IACA,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,GACpB;AAAA,EACD,MAAM,eAAe,WAAS;AAAA,IAC5B,iBAAiB,UAAQ,SAAS,QAAQ,OAAO,KAAK;AAAA;AAAA,EAExD,MAAM,eAAe,WAAW,MAAM,MAAM,EAAE,OAAO,OAAK,EAAE,WAAW,SAAS,CAAC;AAAA,EACjF,MAAM,cAAc,WAAW,MAAM,MAAM,EAAE,OAAO,OAAK,EAAE,WAAW,QAAQ,CAAC;AAAA,EAC/E,QAAQ,MAAM;AAAA,IACZ,IAAI,SAAS,gBAAgB,KAAK,GAChC,SAAS,gBAAgB,MAAM,GAC/B,SAAS,gBAAgB,GAAG;AAAA,IAC9B,aAAa,QAAQ,MAAM;AAAA,IAC3B,aAAa,QAAQ,MAAM;AAAA,IAC3B,aAAa,QAAQ,iBAAiB,OAAO,CAAC;AAAA,IAC9C,SAAS,QAAQ,kBAAkB,MAAM;AAAA,UACnC,IAAI,GAAG;AAAA,QACT,OAAO,OAAO,MAAM;AAAA;AAAA,UAElB,QAAQ,GAAG;AAAA,QACb,IAAI,SAAS,gBAAgB,MAAM;AAAA,QACnC,aAAa,QAAQ,iBAAiB,YAAY,CAAC;AAAA,QACnD,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,EAAE,WAAW,GAAG,CAAC;AAAA,QAC/D,OAAO;AAAA;AAAA,IAEX,CAAC,GAAG,IAAI;AAAA,IACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,UACnC,IAAI,GAAG;AAAA,QACT,OAAO,OAAO,MAAM;AAAA;AAAA,UAElB,QAAQ,GAAG;AAAA,QACb,IAAI,SAAS,gBAAgB,MAAM;AAAA,QACnC,aAAa,QAAQ,iBAAiB,sBAAsB,CAAC;AAAA,QAC7D,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,EAAE,WAAW,GAAG,CAAC;AAAA,QAC/D,OAAO;AAAA;AAAA,IAEX,CAAC,GAAG,IAAI;AAAA,IACR,SAAS,QAAQ,kBAAkB,MAAM;AAAA,UACnC,IAAI,GAAG;AAAA,QACT,OAAO,OAAO,MAAM;AAAA;AAAA,UAElB,QAAQ,GAAG;AAAA,QACb,OAAO,CAAC,kBAAkB,MAAM;AAAA,cAC1B,IAAI,GAAG;AAAA,YACT,OAAO,MAAM,EAAE,SAAS;AAAA;AAAA,cAEtB,QAAQ,GAAG;AAAA,YACb,QAAQ,MAAM;AAAA,cACZ,IAAI,SAAS,gBAAgB,MAAM;AAAA,cACnC,aAAa,QAAQ,iBAAiB,gBAAgB,CAAC;AAAA,cACvD,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,EAAE,WAAW,GAAG,CAAC;AAAA,cAC/D,OAAO;AAAA,eACN;AAAA;AAAA,cAED,QAAQ,GAAG;AAAA,YACb,OAAO,CAAC,kBAAkB,aAAa;AAAA,cACrC,OAAO;AAAA,kBACH,KAAK,GAAG;AAAA,gBACV,OAAO,aAAa;AAAA;AAAA,kBAElB,KAAK,GAAG;AAAA,gBACV,OAAO,MAAM;AAAA;AAAA,kBAEX,IAAI,GAAG;AAAA,gBACT,OAAO,YAAY;AAAA;AAAA,cAErB,UAAU,MAAM,eAAe,OAAK,CAAC,CAAC;AAAA,kBAClC,aAAa,GAAG;AAAA,gBAClB,OAAO,cAAc;AAAA;AAAA,cAEvB,cAAc;AAAA,cACd,gBAAgB;AAAA,kBACZ,kBAAkB,GAAG;AAAA,gBACvB,OAAO,mBAAmB;AAAA;AAAA,YAE9B,CAAC,GAAG,kBAAkB,aAAa;AAAA,cACjC,OAAO;AAAA,kBACH,KAAK,GAAG;AAAA,gBACV,OAAO,YAAY;AAAA;AAAA,kBAEjB,KAAK,GAAG;AAAA,gBACV,OAAO,MAAM;AAAA;AAAA,kBAEX,IAAI,GAAG;AAAA,gBACT,OAAO,WAAW;AAAA;AAAA,cAEpB,UAAU,MAAM,cAAc,OAAK,CAAC,CAAC;AAAA,kBACjC,aAAa,GAAG;AAAA,gBAClB,OAAO,cAAc;AAAA;AAAA,kBAEnB,YAAY,GAAG;AAAA,gBACjB,OAAO,aAAa,EAAE;AAAA;AAAA,cAExB,gBAAgB;AAAA,kBACZ,kBAAkB,GAAG;AAAA,gBACvB,OAAO,mBAAmB;AAAA;AAAA,YAE9B,CAAC,CAAC;AAAA;AAAA,QAEN,CAAC,GAAG,kBAAkB,MAAM;AAAA,cACtB,IAAI,GAAG;AAAA,YACT,OAAO,aAAa,IAAI;AAAA;AAAA,cAEtB,QAAQ,GAAG;AAAA,YACb,IAAI,SAAS,gBAAgB,MAAM,GACjC,SAAS,iBAAiB,6BAA6B;AAAA,YACzD,aAAa,QAAQ,MAAM;AAAA,YAC3B,SAAS,QAAQ,cAAc,MAAM;AAAA,YACrC,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,EAAE,WAAW,GAAG,CAAC;AAAA,YAC/D,OAAO;AAAA;AAAA,QAEX,CAAC,CAAC;AAAA;AAAA,IAEN,CAAC,GAAG,IAAI;AAAA,IACR,SAAS,SAAO,UAAU,QAAQ,MAAM,MAAM,EAAE,MAAM,GAAG,CAAC;AAAA,IAC1D,OAAO;AAAA,KACN;AAAA;;;ADhfL,IAAM,KAAK;AACX,IAAM,MAAM,OAAM,QAAO;AAAA,EACvB,IAAI,MAAM,SAAS;AAAA,IACjB,OAAO;AAAA,IACP,OAAO;AAAA,MACL,iBAAiB,CAAC,KAAK,UAAU,mBAAkB,gBAAgB;AAAA,YAC7D,SAAS,GAAG;AAAA,UACd,OAAO,MAAM;AAAA;AAAA,QAEf;AAAA,YACI,KAAK,GAAG;AAAA,UACV,OAAO,IAAI;AAAA;AAAA,MAEf,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA;AAEH,IAAe;AAAA,EACb;AAAA,EACA;AACF;",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "8A2B78FD948E5F6364756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
package/package.json
CHANGED
package/src/rule-discovery.ts
CHANGED
|
@@ -173,33 +173,45 @@ export interface DiscoveredRule {
|
|
|
173
173
|
export async function discoverRuleFiles(
|
|
174
174
|
projectDir?: string
|
|
175
175
|
): Promise<DiscoveredRule[]> {
|
|
176
|
-
|
|
176
|
+
// Keyed by relativePath; later insertions shadow earlier ones.
|
|
177
|
+
// Global rules are inserted first (lowest precedence); project-local rules
|
|
178
|
+
// are inserted after and overwrite any global entry sharing the same key.
|
|
179
|
+
const byRelativePath = new Map<string, DiscoveredRule>();
|
|
177
180
|
|
|
178
|
-
// Discover global rules (recursively)
|
|
181
|
+
// Discover global rules (recursively) — inserted first (lowest precedence).
|
|
179
182
|
const globalRulesDir = getGlobalRulesDir();
|
|
180
183
|
if (globalRulesDir) {
|
|
181
184
|
const globalRules = await scanDirectoryRecursively(
|
|
182
185
|
globalRulesDir,
|
|
183
186
|
globalRulesDir
|
|
184
187
|
);
|
|
185
|
-
for (const
|
|
186
|
-
debugLog(
|
|
187
|
-
|
|
188
|
+
for (const rule of globalRules) {
|
|
189
|
+
debugLog(
|
|
190
|
+
`Discovered global rule: ${rule.relativePath} (${rule.filePath})`
|
|
191
|
+
);
|
|
192
|
+
byRelativePath.set(rule.relativePath, rule);
|
|
188
193
|
}
|
|
189
194
|
}
|
|
190
195
|
|
|
191
|
-
// Discover project-local rules (recursively)
|
|
196
|
+
// Discover project-local rules (recursively) — shadow global duplicates.
|
|
192
197
|
if (projectDir) {
|
|
193
198
|
const projectRulesDir = path.join(projectDir, '.opencode', 'rules');
|
|
194
199
|
const projectRules = await scanDirectoryRecursively(
|
|
195
200
|
projectRulesDir,
|
|
196
201
|
projectRulesDir
|
|
197
202
|
);
|
|
198
|
-
for (const
|
|
199
|
-
|
|
200
|
-
|
|
203
|
+
for (const rule of projectRules) {
|
|
204
|
+
const shadowed = byRelativePath.has(rule.relativePath);
|
|
205
|
+
debugLog(
|
|
206
|
+
`Discovered project rule: ${rule.relativePath} (${rule.filePath})` +
|
|
207
|
+
(shadowed ? ' [shadows global]' : '')
|
|
208
|
+
);
|
|
209
|
+
byRelativePath.set(rule.relativePath, rule);
|
|
201
210
|
}
|
|
202
211
|
}
|
|
203
212
|
|
|
204
|
-
|
|
213
|
+
// Map preserves insertion order in JS, so global rules keep their relative
|
|
214
|
+
// order and shadowed slots retain their original position but point at the
|
|
215
|
+
// project file.
|
|
216
|
+
return Array.from(byRelativePath.values());
|
|
205
217
|
}
|
package/src/rule-filter.ts
CHANGED
|
@@ -59,12 +59,23 @@ export function toolsMatchAvailable(
|
|
|
59
59
|
return requiredTools.some(tool => availableSet.has(tool));
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Rough token estimate using the chars/4 heuristic.
|
|
64
|
+
* No external dependency; accurate enough for budget decisions.
|
|
65
|
+
*/
|
|
66
|
+
export function estimateTokens(text: string): number {
|
|
67
|
+
if (!text) return 0;
|
|
68
|
+
return Math.ceil(text.length / 4);
|
|
69
|
+
}
|
|
70
|
+
|
|
62
71
|
/**
|
|
63
72
|
* Result of reading and formatting rules
|
|
64
73
|
*/
|
|
65
74
|
export interface FilterResult {
|
|
66
75
|
formattedRules: string;
|
|
67
76
|
matchedPaths: string[];
|
|
77
|
+
/** Estimated token count of formattedRules (0 when empty) */
|
|
78
|
+
tokenEstimate: number;
|
|
68
79
|
}
|
|
69
80
|
|
|
70
81
|
/**
|
|
@@ -91,6 +102,8 @@ export interface RuleFilterContext {
|
|
|
91
102
|
os?: string;
|
|
92
103
|
/** Whether running in CI environment */
|
|
93
104
|
ci?: boolean;
|
|
105
|
+
/** Optional hard token cap; lowest-priority rules are dropped when exceeded. */
|
|
106
|
+
maxTokens?: number;
|
|
94
107
|
}
|
|
95
108
|
|
|
96
109
|
/**
|
|
@@ -103,16 +116,26 @@ export async function readAndFormatRules(
|
|
|
103
116
|
context: RuleFilterContext = {}
|
|
104
117
|
): Promise<FilterResult> {
|
|
105
118
|
if (files.length === 0) {
|
|
106
|
-
return { formattedRules: '', matchedPaths: [] };
|
|
119
|
+
return { formattedRules: '', matchedPaths: [], tokenEstimate: 0 };
|
|
107
120
|
}
|
|
108
121
|
|
|
109
|
-
const ruleContents: string[] = [];
|
|
110
|
-
const matchedPaths: string[] = [];
|
|
111
122
|
const availableToolSet =
|
|
112
123
|
context.availableToolIDs && context.availableToolIDs.length > 0
|
|
113
124
|
? new Set(context.availableToolIDs)
|
|
114
125
|
: undefined;
|
|
115
126
|
|
|
127
|
+
// Collect matched entries with priority and token count
|
|
128
|
+
type MatchedEntry = {
|
|
129
|
+
filePath: string;
|
|
130
|
+
relativePath: string;
|
|
131
|
+
strippedContent: string;
|
|
132
|
+
priority: number;
|
|
133
|
+
tokenCount: number;
|
|
134
|
+
index: number;
|
|
135
|
+
};
|
|
136
|
+
const entries: MatchedEntry[] = [];
|
|
137
|
+
let entryIndex = 0;
|
|
138
|
+
|
|
116
139
|
for (const { filePath, relativePath } of files) {
|
|
117
140
|
// Use cached rule data with mtime-based invalidation
|
|
118
141
|
const cachedRule = await getCachedRule(filePath);
|
|
@@ -250,20 +273,58 @@ export async function readAndFormatRules(
|
|
|
250
273
|
);
|
|
251
274
|
}
|
|
252
275
|
|
|
253
|
-
//
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
276
|
+
// Extract priority (default 0 for selection; undefined in metadata means absent)
|
|
277
|
+
const priority = metadata?.priority ?? 0;
|
|
278
|
+
|
|
279
|
+
// Build formatted chunk for token counting
|
|
280
|
+
const formattedChunk = `## ${relativePath}\n\n${strippedContent}`;
|
|
281
|
+
const tokenCount = estimateTokens(formattedChunk);
|
|
282
|
+
|
|
283
|
+
entries.push({ filePath, relativePath, strippedContent, priority, tokenCount, index: entryIndex++ });
|
|
257
284
|
}
|
|
258
285
|
|
|
259
|
-
if (
|
|
260
|
-
return { formattedRules: '', matchedPaths: [] };
|
|
286
|
+
if (entries.length === 0) {
|
|
287
|
+
return { formattedRules: '', matchedPaths: [], tokenEstimate: 0 };
|
|
261
288
|
}
|
|
262
289
|
|
|
290
|
+
// Determine which entries to include based on budget
|
|
291
|
+
const maxTokens = context.maxTokens;
|
|
292
|
+
const hasValidBudget = typeof maxTokens === 'number' && maxTokens > 0 && Number.isFinite(maxTokens);
|
|
293
|
+
|
|
294
|
+
let survivors: MatchedEntry[];
|
|
295
|
+
if (!hasValidBudget) {
|
|
296
|
+
// No budget: use discovery order (existing behavior)
|
|
297
|
+
survivors = entries;
|
|
298
|
+
} else {
|
|
299
|
+
// Valid budget: stable sort by priority desc, index asc
|
|
300
|
+
const sorted = [...entries].sort((a, b) =>
|
|
301
|
+
(b.priority - a.priority) || (a.index - b.index)
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
// Greedy selection: always keep first (≥1 survivor invariant), then add while within budget
|
|
305
|
+
survivors = [sorted[0]];
|
|
306
|
+
let runningTokens = sorted[0].tokenCount;
|
|
307
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
308
|
+
if (runningTokens + sorted[i].tokenCount <= maxTokens) {
|
|
309
|
+
survivors.push(sorted[i]);
|
|
310
|
+
runningTokens += sorted[i].tokenCount;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Build output from survivors
|
|
316
|
+
const ruleContents = survivors.map(
|
|
317
|
+
entry => `## ${entry.relativePath}\n\n${entry.strippedContent}`
|
|
318
|
+
);
|
|
319
|
+
const matchedPaths = survivors.map(entry => entry.filePath);
|
|
320
|
+
|
|
321
|
+
const formattedRules =
|
|
322
|
+
`# OpenCode Rules\n\nPlease follow the following rules:\n\n` +
|
|
323
|
+
ruleContents.join('\n\n---\n\n');
|
|
324
|
+
|
|
263
325
|
return {
|
|
264
|
-
formattedRules
|
|
265
|
-
`# OpenCode Rules\n\nPlease follow the following rules:\n\n` +
|
|
266
|
-
ruleContents.join('\n\n---\n\n'),
|
|
326
|
+
formattedRules,
|
|
267
327
|
matchedPaths,
|
|
328
|
+
tokenEstimate: estimateTokens(formattedRules),
|
|
268
329
|
};
|
|
269
330
|
}
|
package/src/rule-metadata.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface RuleMetadata {
|
|
|
19
19
|
os?: string[];
|
|
20
20
|
ci?: boolean;
|
|
21
21
|
match?: 'any' | 'all';
|
|
22
|
+
/** Higher priority is kept first when a token budget is enforced. Default 0. */
|
|
23
|
+
priority?: number;
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
/**
|
|
@@ -36,6 +38,7 @@ interface ParsedFrontmatter {
|
|
|
36
38
|
os?: unknown;
|
|
37
39
|
ci?: unknown;
|
|
38
40
|
match?: unknown;
|
|
41
|
+
priority?: unknown;
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
/** Field names in ParsedFrontmatter that are string arrays */
|
|
@@ -129,6 +132,11 @@ export function parseRuleMetadata(content: string): RuleMetadata | undefined {
|
|
|
129
132
|
metadata.match = parsed.match;
|
|
130
133
|
}
|
|
131
134
|
|
|
135
|
+
// Extract priority (finite numbers only; non-finite or absent becomes undefined, treated as 0 downstream)
|
|
136
|
+
if (typeof parsed.priority === 'number' && Number.isFinite(parsed.priority)) {
|
|
137
|
+
metadata.priority = parsed.priority;
|
|
138
|
+
}
|
|
139
|
+
|
|
132
140
|
// Return metadata only if it has content
|
|
133
141
|
return Object.keys(metadata).length > 0 ? metadata : undefined;
|
|
134
142
|
} catch (error) {
|
package/src/runtime-context.ts
CHANGED
|
@@ -62,6 +62,18 @@ export function detectCiEnvironment(): boolean {
|
|
|
62
62
|
);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Resolve the active token budget from the OPENCODE_RULES_MAX_TOKENS env var.
|
|
67
|
+
* Returns undefined when the env var is absent, empty, zero, negative, or non-finite.
|
|
68
|
+
* Positive finite numbers enable budget enforcement.
|
|
69
|
+
*/
|
|
70
|
+
export function resolveMaxTokens(): number | undefined {
|
|
71
|
+
const raw = process.env.OPENCODE_RULES_MAX_TOKENS;
|
|
72
|
+
if (!raw) return undefined;
|
|
73
|
+
const n = Number(raw);
|
|
74
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
65
77
|
/**
|
|
66
78
|
* Build the filter context object used for rule matching.
|
|
67
79
|
* Assembles runtime information from various sources.
|
|
@@ -125,6 +137,10 @@ export async function buildFilterContext(
|
|
|
125
137
|
if (gitBranch !== undefined) {
|
|
126
138
|
context.gitBranch = gitBranch;
|
|
127
139
|
}
|
|
140
|
+
const maxTokens = resolveMaxTokens();
|
|
141
|
+
if (maxTokens !== undefined) {
|
|
142
|
+
context.maxTokens = maxTokens;
|
|
143
|
+
}
|
|
128
144
|
|
|
129
145
|
debugLog(
|
|
130
146
|
`Filter context: model=${modelID ?? 'none'}, agent=${agentType ?? 'none'}, ` +
|