/** * Insert text into the current session's composer draft through the * conversation service — the shared path behind the explorer's @-reference * button and the viewer selection popup. The service is resolved lazily * through `ctx.get` (the inject-free read the app's own plugins use); a * missing service or scope degrades to a logged no-op, never a crash. * * File references additionally use DSH's own structured insert event * (`slash/input-insert-reference`, see `insertFileReference`) instead of * plain draft text: the native `@file` picker emits this event, and the * conversation input machine mints one occurrence whose chip covers the * whole reference. Plain text `@folder/file.ts` only ever gets DSH's * folder-ref decoration (`@folder/`) — the file name stays undecorated — so * plain append is the fallback, not the primary path, for files. * * Insert position (fixes upstream issue #425): the draft store only exposes * the whole string (`getSnapshot().draft` + `setDraft(text)`) — there is no * caret API on the conversation service. The composer's `