fix(keyword-detector): narrow ULW auto-start to leading keyword position only
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -86,6 +86,44 @@ describe("keyword-detector ralph-loop activation", () => {
|
|||||||
expect(startLoopCalls[0].options.ultrawork).toBe(true)
|
expect(startLoopCalls[0].options.ultrawork).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("#given ulw mentioned mid-sentence #when chat.message fires #then ralph-loop startLoop is not invoked", async () => {
|
||||||
|
// given
|
||||||
|
setMainSession("main-session")
|
||||||
|
const startLoopCalls: StartLoopCall[] = []
|
||||||
|
const ralphLoop = createMockRalphLoop(startLoopCalls)
|
||||||
|
const hook = createKeywordDetectorHook(createMockPluginInput(), undefined, ralphLoop)
|
||||||
|
const output = {
|
||||||
|
message: {} as Record<string, unknown>,
|
||||||
|
parts: [{ type: "text", text: "I think ulw is cool" }],
|
||||||
|
}
|
||||||
|
|
||||||
|
// when
|
||||||
|
await hook["chat.message"]({ sessionID: "main-session", agent: "sisyphus" }, output)
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(startLoopCalls).toHaveLength(0)
|
||||||
|
expect(output.parts[0]?.text).toBe("I think ulw is cool")
|
||||||
|
})
|
||||||
|
|
||||||
|
test("#given question about ultrawork #when chat.message fires #then ralph-loop startLoop is not invoked", async () => {
|
||||||
|
// given
|
||||||
|
setMainSession("main-session")
|
||||||
|
const startLoopCalls: StartLoopCall[] = []
|
||||||
|
const ralphLoop = createMockRalphLoop(startLoopCalls)
|
||||||
|
const hook = createKeywordDetectorHook(createMockPluginInput(), undefined, ralphLoop)
|
||||||
|
const output = {
|
||||||
|
message: {} as Record<string, unknown>,
|
||||||
|
parts: [{ type: "text", text: "what is ultrawork?" }],
|
||||||
|
}
|
||||||
|
|
||||||
|
// when
|
||||||
|
await hook["chat.message"]({ sessionID: "main-session", agent: "sisyphus" }, output)
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(startLoopCalls).toHaveLength(0)
|
||||||
|
expect(output.parts[0]?.text).toBe("what is ultrawork?")
|
||||||
|
})
|
||||||
|
|
||||||
test("#given non-ulw message #when chat.message fires #then ralph-loop startLoop is not invoked", async () => {
|
test("#given non-ulw message #when chat.message fires #then ralph-loop startLoop is not invoked", async () => {
|
||||||
// given
|
// given
|
||||||
setMainSession("main-session")
|
setMainSession("main-session")
|
||||||
|
|||||||
@@ -16,11 +16,16 @@ import type { RalphLoopHook } from "../ralph-loop"
|
|||||||
import { parseRalphLoopArguments } from "../ralph-loop/command-arguments"
|
import { parseRalphLoopArguments } from "../ralph-loop/command-arguments"
|
||||||
|
|
||||||
const ULTRAWORK_KEYWORD_PATTERN = /\b(ultrawork|ulw)\b/i
|
const ULTRAWORK_KEYWORD_PATTERN = /\b(ultrawork|ulw)\b/i
|
||||||
|
const LEADING_ULTRAWORK_PATTERN = /^\s*(ultrawork|ulw)\b/i
|
||||||
|
|
||||||
function extractUltraworkTask(cleanText: string): string {
|
function extractUltraworkTask(cleanText: string): string {
|
||||||
return cleanText.replace(ULTRAWORK_KEYWORD_PATTERN, "").trim()
|
return cleanText.replace(ULTRAWORK_KEYWORD_PATTERN, "").trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hasLeadingUltraworkKeyword(cleanText: string): boolean {
|
||||||
|
return LEADING_ULTRAWORK_PATTERN.test(cleanText)
|
||||||
|
}
|
||||||
|
|
||||||
export function createKeywordDetectorHook(
|
export function createKeywordDetectorHook(
|
||||||
ctx: PluginInput,
|
ctx: PluginInput,
|
||||||
_collector?: ContextCollector,
|
_collector?: ContextCollector,
|
||||||
@@ -76,6 +81,16 @@ export function createKeywordDetectorHook(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!hasLeadingUltraworkKeyword(cleanText)) {
|
||||||
|
const preFilterCount = detectedKeywords.length
|
||||||
|
detectedKeywords = detectedKeywords.filter((k) => k.type !== "ultrawork")
|
||||||
|
if (preFilterCount > detectedKeywords.length) {
|
||||||
|
log(`[keyword-detector] Filtered non-leading ultrawork keyword`, {
|
||||||
|
sessionID: input.sessionID,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (detectedKeywords.length === 0) {
|
if (detectedKeywords.length === 0) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user