feat(keyword-detector): add enabled_expansions config for allowlist control
Add optional enabled_expansions field to keyword_detector config schema. When set, acts as an allowlist - only those expansion types fire. Empty array disables all expansions. Absent field keeps all enabled (backward-compatible). Also supports coexistence with disabled_keywords denylist for fine-grained control. - src/config/schema/keyword-detector.ts: add enabled_expansions field - src/hooks/keyword-detector/detector.ts: apply allowlist filter in detectKeywordsWithType - src/hooks/keyword-detector/hook.ts: pass enabled_expansions from config - src/hooks/keyword-detector/index.test.ts: add 4 tests for enabled_expansions behavior - assets/oh-my-opencode.schema.json: regenerate schema
This commit is contained in:
@@ -34,8 +34,9 @@ export function detectKeywords(
|
||||
agentName?: string,
|
||||
modelID?: string,
|
||||
disabledKeywords?: ReadonlyArray<KeywordType>,
|
||||
enabledExpansions?: ReadonlyArray<KeywordType>,
|
||||
): string[] {
|
||||
return detectKeywordsWithType(text, agentName, modelID, disabledKeywords).map(
|
||||
return detectKeywordsWithType(text, agentName, modelID, disabledKeywords, enabledExpansions).map(
|
||||
({ message }) => message,
|
||||
)
|
||||
}
|
||||
@@ -45,6 +46,7 @@ export function detectKeywordsWithType(
|
||||
agentName?: string,
|
||||
modelID?: string,
|
||||
disabledKeywords?: ReadonlyArray<KeywordType>,
|
||||
enabledExpansions?: ReadonlyArray<KeywordType>,
|
||||
): DetectedKeyword[] {
|
||||
const textWithoutCode = removeCodeBlocks(text)
|
||||
const disabled = new Set<KeywordType>(disabledKeywords ?? [])
|
||||
@@ -52,12 +54,19 @@ export function detectKeywordsWithType(
|
||||
if (disabled.has("ultrawork") || disabled.has("hyperplan")) {
|
||||
disabled.add("hyperplan-ultrawork")
|
||||
}
|
||||
// Allowlist: if enabledExpansions is set, only those types fire
|
||||
const allowlist = enabledExpansions ? new Set<KeywordType>(enabledExpansions) : null
|
||||
return KEYWORD_DETECTORS.map(({ type, pattern, message }) => ({
|
||||
matches: pattern.test(textWithoutCode),
|
||||
type,
|
||||
message: resolveMessage(message, agentName, modelID),
|
||||
}))
|
||||
.filter((result) => result.matches && !disabled.has(result.type))
|
||||
.filter((result) => {
|
||||
if (!result.matches) return false
|
||||
if (allowlist && !allowlist.has(result.type)) return false
|
||||
if (disabled.has(result.type)) return false
|
||||
return true
|
||||
})
|
||||
.map(({ type, message }) => ({ type, message }))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user