deer-flow/frontend/tests/e2e/utils/raw-identifiers.ts
Totoro c48447a4ae
fix(runtime): present outputs before a loop wrap-up and explain step-limit stops (#7588)
* fix(runtime): present outputs before a loop wrap-up and explain step-limit stops

Loop-detection warnings now ask the agent to present the files it already
created in /mnt/user-data/outputs before its final answer, when
present_files is available.

A run that exhausts recursion_limit now ends with stop_reason
recursion_capped and a plain message that lists outputs it created but
did not present. An active goal stands down without an evaluator call.
The /wait error envelope keeps the GraphRecursionError name, and IM
channels reply with the step-limit message instead of a generic failure.

* docs(changelog): note run-end delivery and step-limit stops (#7588)

* test(runtime): stop pinning LangGraph's step count in the step-limit test

The produced paths and the message already follow the observed model
calls, so the exact count only pinned LangGraph's per-step accounting.
Also note on the step-limit goal branch that its caller passes no
evaluator factory, so it has to stay ahead of the evaluator section.

---------

Co-authored-by: Totoro-qaq <279883115+Totoro-qaq@users.noreply.github.com>
Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
2026-10-27 10:34:34 +08:00

27 lines
1.6 KiB
TypeScript

/**
* Text that must never appear in a default view of scheduled tasks or the
* chat goal bar: UUIDs, task/run ids, ISO timestamps, five-field cron
* strings, internal enum or field names, goal stand-down codes
* (`contracts/thread_goal_contract.json`), checker blockers and the met
* record's field names. Pure (no test-runner imports) so the Playwright
* helper (`readable.ts`) and the unit helper (`tests/unit/helpers/readable.ts`)
* share one list.
*/
export const RAW_IDENTIFIER_PATTERNS: readonly RegExp[] = [
/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i,
/\btask-(run-)?[0-9a-f]{16,}\b/,
/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/,
/(^|\s)[\d*/,-]+(\s[\d*/,-]+){4}(\s|$)/,
/\b(fresh_thread_per_run|reuse_thread|lead_agent|goal_objective|max_runs|end_at|unmet|stop_scheduled_task|schedule_task)\b/,
/\b(blocked:[a-z_]+|max_continuations_reached|no_progress_detected|token_capped|loop_capped|recursion_capped|evaluator_failed|no_durable_end_of_turn|thread_changed_(after_evaluation|before_continuation)|goal_outcome|stand_down_reason|last_evaluation)\b/,
/\b(goal_not_met_yet|needs_user_input|missing_evidence|external_wait|run_failed|goal_created_at|reply_message_id|relied_on_assumption|continuation_count|max_continuations)\b/,
];
/** The patterns `text` matches, with the matched text, for a readable failure message. */
export function findRawIdentifiers(text: string): string[] {
return RAW_IDENTIFIER_PATTERNS.flatMap((pattern) => {
const match = pattern.exec(text);
return match ? [`${pattern.source} → "${match[0].trim()}"`] : [];
});
}