| 1 | export type DecisionSurfaceKind = |
| 2 | | "tool_approval" |
| 3 | | "plan_approval" |
| 4 | | "ask" |
| 5 | | "workspace_conflict" |
| 6 | | "mode_jobs" |
| 7 | | "close_active" |
| 8 | | "clear_context"; |
| 9 | |
| 10 | export const DECISION_SURFACE_MOCK_TRIGGERS: Readonly<Record<DecisionSurfaceKind, string>> = { |
| 11 | tool_approval: "/mock-tool-approval", |
| 12 | plan_approval: "/mock-plan-approval", |
| 13 | ask: "/mock-ask", |
| 14 | workspace_conflict: "/mock-workspace-conflict", |
| 15 | mode_jobs: "/mock-mode-jobs", |
| 16 | close_active: "/mock-close-active", |
| 17 | clear_context: "/mock-clear-context", |
| 18 | }; |
| 19 | |
| 20 | // QA-only stress scene. Keep this separate from the seven product decision |
| 21 | // surfaces so the canonical inventory stays stable while copy/layout extremes |
| 22 | // can be exercised through the same Ask card used in production. |
| 23 | export const LONG_DECISION_OPTIONS_MOCK_TRIGGER = "/mock-long-options"; |
| 24 | |
| 25 | const aliases: Readonly<Record<string, DecisionSurfaceKind>> = { |
| 26 | ...Object.fromEntries( |
| 27 | Object.entries(DECISION_SURFACE_MOCK_TRIGGERS).map(([kind, trigger]) => [trigger, kind]), |
| 28 | ) as Record<string, DecisionSurfaceKind>, |
| 29 | "/approve-preview": "tool_approval", |
| 30 | "approve preview": "tool_approval", |
| 31 | "approve预览": "tool_approval", |
| 32 | "/plan-approve-preview": "plan_approval", |
| 33 | "plan approve preview": "plan_approval", |
| 34 | "plan approve预览": "plan_approval", |
| 35 | "/ask-preview": "ask", |
| 36 | "ask preview": "ask", |
| 37 | "ask预览": "ask", |
| 38 | "mock 工具审批": "tool_approval", |
| 39 | "mock 计划审批": "plan_approval", |
| 40 | "mock 提问": "ask", |
| 41 | "mock 工作区冲突": "workspace_conflict", |
| 42 | "mock 模式切换": "mode_jobs", |
| 43 | "mock 关闭任务": "close_active", |
| 44 | "mock 清空上下文": "clear_context", |
| 45 | }; |
| 46 | |
| 47 | export function decisionSurfaceMockFromInput(input: string): DecisionSurfaceKind | null { |
| 48 | return aliases[input.trim().toLowerCase()] ?? null; |
| 49 | } |
| 50 | |
| 51 | export function isLongDecisionOptionsMockInput(input: string): boolean { |
| 52 | const normalized = input.trim().toLowerCase(); |
| 53 | return normalized === LONG_DECISION_OPTIONS_MOCK_TRIGGER || normalized === "mock 长文案选项"; |
| 54 | } |
| 55 |