Quick replies for Cliq. A prototype to experiment with a rule-based approach (limited, action suggestions mostly), no models were harmed in the making of this.
No history yet.
Admin access · 4-digit PIN
dataset.json, which is what you want when QA-ing hundreds of phrasings by hand. The whole thing rests on three ideas.byeee → bye), drop stopwords, lightly stem the rest (ing/ies/ed/s/ly), with a carve-out so boxes/catches aren't mangled.```code``` block, a URL, a short bare affirmation (sure, done...) matched as the whole message, a reminder lead ("remember to...", "make sure to..."), and — only as fallbacks if nothing else matched — a whereabouts question, an availability ask ("are you free?"), or a bare time like "4 pm?". @mentions are detected separately and, when the surrounding words are actionable, attach an "Open X's chat" action.trigger plus keywords); a phrase matches only if every one of its significant tokens appears — order doesn't matter. A rule's base weight is its best phrase's token count squared, so a specific phrase dominates a lone keyword (hop on a call = 3² = 9 vs call = 1). Optional boost regexes add weight (for strong leads like "remind me" that collapse to one token); optional penalty regexes subtract it. The net-highest rule with a positive score wins; ties keep dataset order.exclude idiom list (a hard veto); recap detection (its own words in past tense, or "had a meeting"/"went to", unless a live signal like ?/"you"/"let's" overrides); or a global context filter — an action rule is suppressed when the message negates the action ("don't call"), complains about a UI feature ("the call button is broken"), or quotes/reports speech ("he said 'call me'"). The first survivor wins; if none, the fallbacks run.tomorrow...) and time (3 PM, half past 3, noon...) are pulled out and combined into {when} for templated replies.positive/negative/ask — never two from one), then a mood-matched filler tops up any gap. A reply keeps its baked-in emoji only if the incoming message used one.Before adding any keyword phrase, run it through stopword removal and stemming in your head. "whats up" reduces to just ["what"] (up is a stopword) — as a keyword that matches any message with the word "what". Same trap: "works for you" → ["work"], "on leave" → ["leave"], "my bad" → ["bad"]. If a phrase collapses to one common word, find a safer multi-token phrasing, or add a targeted exclude regex for the bad pattern rather than dropping the coverage entirely.
hop on a call = 9, call = 1), so a specific phrase dominates a lone keyword. The net-highest rule wins.exclude regex (a true idiom like "call it a day") drops the rule outright. A soft penalty only subtracts weight — so a strong positive can outlast it: "hop on a call" (9) survives a −3 penalty, but a bare "call" (1) doesn't. A boost does the reverse for high-signal leads.@mentions, the surrounding verb decides: "ping @A" opens a chat, "thanks @A" doesn't.fillerMood just picks which pool of fillers to draw from, so the padding matches the rule's tone. Optional; defaults to neutral.| neutral | Reacting to being informed. e.g. "Noted, thanks." / "Sounds good." |
| warm | Friendlier acknowledgement. e.g. "Thanks for letting me know!" |
| casual | Light banter, nothing reported. e.g. "Ha, fair enough." / "Good stuff!" |
| empathetic | Bad news / sympathy. e.g. "Here if you need anything." |
| celebratory | Good news / wins. e.g. "That's fantastic!" / "Wonderful news!" |
| closure | Wrapping up. e.g. "Take care!" / "Have a great one!" |
call, meeting, reminder, open-chat, share_slots, react. Only id, trigger and stances are required; everything else is optional. exclude is a hard veto (regexes that drop the rule); penalty and boost are soft, weighted regexes that subtract or add score — each entry is a pattern string, or a [pattern, weight] pair to override the default. Slots {when}, {day} and {time} in a variant are filled from the extracted entities (or a safe default when the message had none).