char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
92d1bb0c9
char/aliceai-t5-moe
1// Guards the slash-command dispatch contract: commands dispatch only on 2// explicit selection (Enter/click in the picker), never mid-typing. 3// Typing `/model is broken` is prose until the command is picked - the 4// buffer must survive; only an actual selection consumes the token. 5 6import ChatFormPickersHarness from './components/ChatFormPickersHarness.svelte' ; 7import { tick } from 'svelte' ; 8import { describe , expect , it } from 'vitest' ; 9import { render } from 'vitest-browser-svelte' ; 10 11describe ( 'slash command dispatch' , () => { 12it ( 'does not dispatch or clear the buffer when a space follows the name' , async () => { 13const screen = render ( ChatFormPickersHarness ); 14 15await tick (); 16 17screen . component . type ( '/model is broken' ); 18await tick (); 19 20const pickers = screen . component . getPickers (); 21 22expect ( screen . component . getValue ()). toBe ( '/model is broken' ); 23expect ( screen . component . getCalls ()). not . toContain ( 'openModelSelector' ); 24expect ( screen . component . getCalls (). some (( c ) => c . startsWith ( 'setValue:' ))). toBe ( false ); 25expect ( pickers . isCommandPickerOpen ). toBe ( true ); 26expect ( pickers . commandQuery ). toBe ( 'model' ); 27}); 28 29it ( 'dispatches /model on explicit selection and consumes the token' , async () => { 30const screen = render ( ChatFormPickersHarness ); 31 32await tick (); 33 34screen . component . type ( '/model is broken' ); 35await tick (); 36 37const pickers = screen . component . getPickers (); 38const model = pickers . availableCommands . find (( c ) => c . name === 'model' ); 39 40if ( ! model ) throw new Error ( 'model command missing' ); 41 42pickers . handleCommandSelect ( model ); 43await tick (); 44 45expect ( screen . component . getValue ()). toBe ( '' ); 46expect ( screen . component . getCalls ()). toContain ( 'openModelSelector' ); 47expect ( pickers . isCommandPickerOpen ). toBe ( false ); 48}); 49 50it ( 'seeds the prompt picker search from the token args on selection' , async () => { 51const screen = render ( ChatFormPickersHarness ); 52 53await tick (); 54 55screen . component . type ( '/prompt weather' ); 56await tick (); 57 58const pickers = screen . component . getPickers (); 59 60expect ( pickers . isPromptPickerOpen ). toBe ( false ); 61 62const prompt = pickers . availableCommands . find (( c ) => c . name === 'prompt' ); 63 64if ( ! prompt ) throw new Error ( 'prompt command missing' ); 65 66pickers . handleCommandSelect ( prompt ); 67await tick (); 68 69expect ( screen . component . getValue ()). toBe ( '' ); 70expect ( pickers . isPromptPickerOpen ). toBe ( true ); 71expect ( pickers . promptSearchQuery ). toBe ( 'weather' ); 72}); 73 74it ( 'normalizes a partial /cwd token on selection and keeps it in the buffer' , async () => { 75const screen = render ( ChatFormPickersHarness ); 76 77await tick (); 78 79screen . component . type ( '/cw docs' ); 80await tick (); 81 82const pickers = screen . component . getPickers (); 83 84expect ( pickers . isWorkingDirectoryPickerOpen ). toBe ( false ); 85 86const cwd = pickers . availableCommands . find (( c ) => c . name === 'cwd' ); 87 88if ( ! cwd ) throw new Error ( 'cwd command missing' ); 89 90pickers . handleCommandSelect ( cwd ); 91await tick (); 92 93expect ( pickers . isWorkingDirectoryPickerOpen ). toBe ( true ); 94expect ( pickers . workingDirectoryQuery ). toBe ( 'docs' ); 95expect ( screen . component . getValue ()). toBe ( '/cwd docs' ); 96}); 97 98it ( 'syncs the /cwd token into the picker search while the picker is open' , async () => { 99const screen = render ( ChatFormPickersHarness ); 100 101await tick (); 102 103const pickers = screen . component . getPickers (); 104const cwd = pickers . availableCommands . find (( c ) => c . name === 'cwd' ); 105 106if ( ! cwd ) throw new Error ( 'cwd command missing' ); 107 108screen . component . type ( '/cwd docs' ); 109pickers . handleCommandSelect ( cwd ); 110await tick (); 111 112screen . component . type ( '/cwd docs/sub' ); 113await tick (); 114 115expect ( pickers . isWorkingDirectoryPickerOpen ). toBe ( true ); 116expect ( pickers . workingDirectoryQuery ). toBe ( 'docs/sub' ); 117expect ( pickers . isCommandPickerOpen ). toBe ( false ); 118}); 119 120it ( 'abandons the /cwd picker when the token is edited away from /cwd' , async () => { 121const screen = render ( ChatFormPickersHarness ); 122 123await tick (); 124 125const pickers = screen . component . getPickers (); 126const cwd = pickers . availableCommands . find (( c ) => c . name === 'cwd' ); 127 128if ( ! cwd ) throw new Error ( 'cwd command missing' ); 129 130screen . component . type ( '/cwd docs' ); 131pickers . handleCommandSelect ( cwd ); 132await tick (); 133 134screen . component . type ( '/cwdd docs' ); 135await tick (); 136 137expect ( pickers . isWorkingDirectoryPickerOpen ). toBe ( false ); 138}); 139});