bdc07be344
Updates soul.c and all per-module .c files with: - parse_float_x100() engram score fix - id_in_seen dedup wiring across session_preload - session-end summary hook + session-start recall - Emergency structural repair (no duplicate fns, all callsites wired)
220 lines
19 KiB
C
Generated
220 lines
19 KiB
C
Generated
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include "el_runtime.h"
|
|
|
|
el_val_t tier_working(void);
|
|
el_val_t tier_episodic(void);
|
|
el_val_t tier_canonical(void);
|
|
el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags);
|
|
el_val_t mem_remember(el_val_t content, el_val_t tags);
|
|
el_val_t mem_recall(el_val_t query, el_val_t depth);
|
|
el_val_t mem_search(el_val_t query, el_val_t limit);
|
|
el_val_t mem_strengthen(el_val_t node_id);
|
|
el_val_t mem_forget(el_val_t node_id);
|
|
el_val_t mem_consolidate(void);
|
|
el_val_t mem_save(el_val_t path);
|
|
el_val_t mem_load(el_val_t path);
|
|
el_val_t mem_boot_count_get(void);
|
|
el_val_t mem_boot_count_inc(void);
|
|
el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content);
|
|
el_val_t soft_bell_threshold(void);
|
|
el_val_t hard_bell_threshold(void);
|
|
el_val_t safety_score_crisis(el_val_t input);
|
|
el_val_t safety_score_harm(el_val_t input);
|
|
el_val_t safety_score_danger(el_val_t input);
|
|
el_val_t safety_score_distress_history(el_val_t history);
|
|
el_val_t safety_threat_score(el_val_t input, el_val_t history);
|
|
el_val_t safety_screen(el_val_t input, el_val_t history);
|
|
el_val_t safety_validate(el_val_t output, el_val_t action);
|
|
el_val_t safety_log_bell(el_val_t level, el_val_t reason, el_val_t input_summary);
|
|
el_val_t safety_self_harm_phrases(void);
|
|
el_val_t safety_abuse_phrases(void);
|
|
el_val_t safety_general_hard_phrases(void);
|
|
el_val_t safety_soft_phrases(void);
|
|
el_val_t safety_detect_positive_level(el_val_t message);
|
|
el_val_t safety_detect_bell_level(el_val_t message);
|
|
el_val_t safety_classify_hard_bell(el_val_t message);
|
|
el_val_t safety_soft_directive(void);
|
|
el_val_t safety_hard_directive(el_val_t hard_type);
|
|
el_val_t safety_augment_system(el_val_t system, el_val_t user_msg);
|
|
el_val_t safety_contact_path(void);
|
|
el_val_t handle_safety_contact_get(void);
|
|
el_val_t handle_safety_contact_post(el_val_t body);
|
|
|
|
el_val_t soft_bell_threshold(void) {
|
|
return 35;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t hard_bell_threshold(void) {
|
|
return 70;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_score_crisis(el_val_t input) {
|
|
el_val_t s1 = ({ el_val_t _if_result_1 = 0; if (str_contains(input, EL_STR("kill myself"))) { _if_result_1 = (80); } else { _if_result_1 = (0); } _if_result_1; });
|
|
el_val_t s2 = ({ el_val_t _if_result_2 = 0; if (str_contains(input, EL_STR("want to die"))) { _if_result_2 = (75); } else { _if_result_2 = (0); } _if_result_2; });
|
|
el_val_t s3 = ({ el_val_t _if_result_3 = 0; if (str_contains(input, EL_STR("end my life"))) { _if_result_3 = (80); } else { _if_result_3 = (0); } _if_result_3; });
|
|
el_val_t s4 = ({ el_val_t _if_result_4 = 0; if (str_contains(input, EL_STR("suicide"))) { _if_result_4 = (70); } else { _if_result_4 = (0); } _if_result_4; });
|
|
el_val_t s5 = ({ el_val_t _if_result_5 = 0; if (str_contains(input, EL_STR("suicidal"))) { _if_result_5 = (75); } else { _if_result_5 = (0); } _if_result_5; });
|
|
el_val_t s6 = ({ el_val_t _if_result_6 = 0; if (str_contains(input, EL_STR("don't want to be here"))) { _if_result_6 = (60); } else { _if_result_6 = (0); } _if_result_6; });
|
|
el_val_t s7 = ({ el_val_t _if_result_7 = 0; if (str_contains(input, EL_STR("no reason to live"))) { _if_result_7 = (70); } else { _if_result_7 = (0); } _if_result_7; });
|
|
el_val_t s8 = ({ el_val_t _if_result_8 = 0; if (str_contains(input, EL_STR("better off dead"))) { _if_result_8 = (75); } else { _if_result_8 = (0); } _if_result_8; });
|
|
el_val_t s9 = ({ el_val_t _if_result_9 = 0; if (str_contains(input, EL_STR("can't go on"))) { _if_result_9 = (50); } else { _if_result_9 = (0); } _if_result_9; });
|
|
el_val_t s10 = ({ el_val_t _if_result_10 = 0; if (str_contains(input, EL_STR("not worth living"))) { _if_result_10 = (65); } else { _if_result_10 = (0); } _if_result_10; });
|
|
return (((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10);
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_score_harm(el_val_t input) {
|
|
el_val_t s1 = ({ el_val_t _if_result_11 = 0; if (str_contains(input, EL_STR("hurt myself"))) { _if_result_11 = (60); } else { _if_result_11 = (0); } _if_result_11; });
|
|
el_val_t s2 = ({ el_val_t _if_result_12 = 0; if (str_contains(input, EL_STR("cut myself"))) { _if_result_12 = (65); } else { _if_result_12 = (0); } _if_result_12; });
|
|
el_val_t s3 = ({ el_val_t _if_result_13 = 0; if (str_contains(input, EL_STR("self harm"))) { _if_result_13 = (60); } else { _if_result_13 = (0); } _if_result_13; });
|
|
el_val_t s4 = ({ el_val_t _if_result_14 = 0; if (str_contains(input, EL_STR("self-harm"))) { _if_result_14 = (60); } else { _if_result_14 = (0); } _if_result_14; });
|
|
el_val_t s5 = ({ el_val_t _if_result_15 = 0; if (str_contains(input, EL_STR("overdose"))) { _if_result_15 = (65); } else { _if_result_15 = (0); } _if_result_15; });
|
|
el_val_t s6 = ({ el_val_t _if_result_16 = 0; if (str_contains(input, EL_STR("take all my pills"))) { _if_result_16 = (75); } else { _if_result_16 = (0); } _if_result_16; });
|
|
el_val_t s7 = ({ el_val_t _if_result_17 = 0; if (str_contains(input, EL_STR("starving myself"))) { _if_result_17 = (50); } else { _if_result_17 = (0); } _if_result_17; });
|
|
el_val_t s8 = ({ el_val_t _if_result_18 = 0; if (str_contains(input, EL_STR("burning myself"))) { _if_result_18 = (60); } else { _if_result_18 = (0); } _if_result_18; });
|
|
el_val_t s9 = ({ el_val_t _if_result_19 = 0; if (str_contains(input, EL_STR("punish myself"))) { _if_result_19 = (40); } else { _if_result_19 = (0); } _if_result_19; });
|
|
el_val_t s10 = ({ el_val_t _if_result_20 = 0; if (str_contains(input, EL_STR("deserve to suffer"))) { _if_result_20 = (45); } else { _if_result_20 = (0); } _if_result_20; });
|
|
return (((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10);
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_score_danger(el_val_t input) {
|
|
el_val_t s1 = ({ el_val_t _if_result_21 = 0; if ((str_contains(input, EL_STR("help me")) && str_contains(input, EL_STR("emergency")))) { _if_result_21 = (55); } else { _if_result_21 = (0); } _if_result_21; });
|
|
el_val_t s2 = ({ el_val_t _if_result_22 = 0; if (str_contains(input, EL_STR("call 911"))) { _if_result_22 = (50); } else { _if_result_22 = (0); } _if_result_22; });
|
|
el_val_t s3 = ({ el_val_t _if_result_23 = 0; if (str_contains(input, EL_STR("call an ambulance"))) { _if_result_23 = (55); } else { _if_result_23 = (0); } _if_result_23; });
|
|
el_val_t s4 = ({ el_val_t _if_result_24 = 0; if (str_contains(input, EL_STR("in danger"))) { _if_result_24 = (50); } else { _if_result_24 = (0); } _if_result_24; });
|
|
el_val_t s5 = ({ el_val_t _if_result_25 = 0; if (str_contains(input, EL_STR("someone is threatening"))) { _if_result_25 = (60); } else { _if_result_25 = (0); } _if_result_25; });
|
|
el_val_t s6 = ({ el_val_t _if_result_26 = 0; if (str_contains(input, EL_STR("being abused"))) { _if_result_26 = (55); } else { _if_result_26 = (0); } _if_result_26; });
|
|
el_val_t s7 = ({ el_val_t _if_result_27 = 0; if (str_contains(input, EL_STR("domestic violence"))) { _if_result_27 = (55); } else { _if_result_27 = (0); } _if_result_27; });
|
|
el_val_t s8 = ({ el_val_t _if_result_28 = 0; if ((str_contains(input, EL_STR("trapped")) && str_contains(input, EL_STR("can't escape")))) { _if_result_28 = (60); } else { _if_result_28 = (0); } _if_result_28; });
|
|
el_val_t s9 = ({ el_val_t _if_result_29 = 0; if (str_contains(input, EL_STR("he is going to hurt"))) { _if_result_29 = (65); } else { _if_result_29 = (0); } _if_result_29; });
|
|
el_val_t s10 = ({ el_val_t _if_result_30 = 0; if (str_contains(input, EL_STR("she is going to hurt"))) { _if_result_30 = (65); } else { _if_result_30 = (0); } _if_result_30; });
|
|
return (((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10);
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_score_distress_history(el_val_t history) {
|
|
el_val_t s1 = ({ el_val_t _if_result_31 = 0; if (str_contains(history, EL_STR("hopeless"))) { _if_result_31 = (15); } else { _if_result_31 = (0); } _if_result_31; });
|
|
el_val_t s2 = ({ el_val_t _if_result_32 = 0; if (str_contains(history, EL_STR("worthless"))) { _if_result_32 = (15); } else { _if_result_32 = (0); } _if_result_32; });
|
|
el_val_t s3 = ({ el_val_t _if_result_33 = 0; if (str_contains(history, EL_STR("nobody cares"))) { _if_result_33 = (15); } else { _if_result_33 = (0); } _if_result_33; });
|
|
el_val_t s4 = ({ el_val_t _if_result_34 = 0; if (str_contains(history, EL_STR("no one cares"))) { _if_result_34 = (15); } else { _if_result_34 = (0); } _if_result_34; });
|
|
el_val_t s5 = ({ el_val_t _if_result_35 = 0; if (str_contains(history, EL_STR("completely alone"))) { _if_result_35 = (15); } else { _if_result_35 = (0); } _if_result_35; });
|
|
el_val_t s6 = ({ el_val_t _if_result_36 = 0; if (str_contains(history, EL_STR("all alone"))) { _if_result_36 = (10); } else { _if_result_36 = (0); } _if_result_36; });
|
|
el_val_t s7 = ({ el_val_t _if_result_37 = 0; if (str_contains(history, EL_STR("can't take it anymore"))) { _if_result_37 = (20); } else { _if_result_37 = (0); } _if_result_37; });
|
|
el_val_t s8 = ({ el_val_t _if_result_38 = 0; if (str_contains(history, EL_STR("want to disappear"))) { _if_result_38 = (20); } else { _if_result_38 = (0); } _if_result_38; });
|
|
el_val_t s9 = ({ el_val_t _if_result_39 = 0; if (str_contains(history, EL_STR("don't care anymore"))) { _if_result_39 = (15); } else { _if_result_39 = (0); } _if_result_39; });
|
|
el_val_t s10 = ({ el_val_t _if_result_40 = 0; if (str_contains(history, EL_STR("giving up"))) { _if_result_40 = (15); } else { _if_result_40 = (0); } _if_result_40; });
|
|
return (((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10);
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_threat_score(el_val_t input, el_val_t history) {
|
|
el_val_t input_lower = str_to_lower(input);
|
|
el_val_t history_lower = str_to_lower(history);
|
|
el_val_t crisis = safety_score_crisis(input_lower);
|
|
el_val_t harm = safety_score_harm(input_lower);
|
|
el_val_t danger = safety_score_danger(input_lower);
|
|
el_val_t hist = safety_score_distress_history(history_lower);
|
|
el_val_t input_score = ({ el_val_t _if_result_41 = 0; if ((crisis > harm)) { _if_result_41 = (({ el_val_t _if_result_42 = 0; if ((crisis > danger)) { _if_result_42 = (crisis); } else { _if_result_42 = (danger); } _if_result_42; })); } else { _if_result_41 = (({ el_val_t _if_result_43 = 0; if ((harm > danger)) { _if_result_43 = (harm); } else { _if_result_43 = (danger); } _if_result_43; })); } _if_result_41; });
|
|
el_val_t hist_contrib = (hist / 3);
|
|
el_val_t raw = (input_score + hist_contrib);
|
|
el_val_t score = ({ el_val_t _if_result_44 = 0; if ((raw > 100)) { _if_result_44 = (100); } else { _if_result_44 = (raw); } _if_result_44; });
|
|
return score;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_screen(el_val_t input, el_val_t history) {
|
|
el_val_t score = safety_threat_score(input, history);
|
|
el_val_t hard = hard_bell_threshold();
|
|
el_val_t soft = soft_bell_threshold();
|
|
if (score >= hard) {
|
|
el_val_t summary = str_slice(input, 0, 80);
|
|
el_val_t discard = safety_log_bell(EL_STR("hard"), EL_STR("immediate safety concern"), summary);
|
|
return EL_STR("{\"action\":\"hard_bell\",\"reason\":\"immediate safety concern\",\"content\":\"\"}");
|
|
}
|
|
if (score >= soft) {
|
|
el_val_t summary = str_slice(input, 0, 80);
|
|
el_val_t discard = safety_log_bell(EL_STR("soft"), EL_STR("wellbeing check needed"), summary);
|
|
el_val_t e1 = str_replace(input, EL_STR("\\"), EL_STR("\\\\"));
|
|
el_val_t e2 = str_replace(e1, EL_STR("\""), EL_STR("\\\""));
|
|
el_val_t e3 = str_replace(e2, EL_STR("\n"), EL_STR("\\n"));
|
|
el_val_t e4 = str_replace(e3, EL_STR("\r"), EL_STR("\\r"));
|
|
el_val_t safe_input = str_replace(e4, EL_STR("\t"), EL_STR("\\t"));
|
|
return el_str_concat(el_str_concat(EL_STR("{\"action\":\"soft_bell\",\"reason\":\"wellbeing check needed\",\"content\":\""), safe_input), EL_STR("\"}"));
|
|
}
|
|
el_val_t e1 = str_replace(input, EL_STR("\\"), EL_STR("\\\\"));
|
|
el_val_t e2 = str_replace(e1, EL_STR("\""), EL_STR("\\\""));
|
|
el_val_t e3 = str_replace(e2, EL_STR("\n"), EL_STR("\\n"));
|
|
el_val_t e4 = str_replace(e3, EL_STR("\r"), EL_STR("\\r"));
|
|
el_val_t safe_input = str_replace(e4, EL_STR("\t"), EL_STR("\\t"));
|
|
return el_str_concat(el_str_concat(EL_STR("{\"action\":\"pass\",\"content\":\""), safe_input), EL_STR("\"}"));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_validate(el_val_t output, el_val_t action) {
|
|
if (str_eq(action, EL_STR("hard_bell"))) {
|
|
return EL_STR("I'm here with you, and what you're sharing sounds serious. Please reach out to a crisis line now \xe2\x80\x94 in the US you can call or text 988 (Suicide and Crisis Lifeline), available 24/7. You don't have to go through this alone.");
|
|
}
|
|
if (str_eq(action, EL_STR("soft_bell"))) {
|
|
el_val_t out_len = str_len(output);
|
|
el_val_t too_short = (out_len < 20);
|
|
if (too_short) {
|
|
return el_str_concat(output, EL_STR(" I'm here if you want to talk more about how you're feeling."));
|
|
}
|
|
return output;
|
|
}
|
|
return output;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_log_bell(el_val_t level, el_val_t reason, el_val_t input_summary) {
|
|
el_val_t content = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("BELL:"), level), EL_STR(" | ")), reason), EL_STR(" | summary:")), input_summary);
|
|
el_val_t tags = el_str_concat(el_str_concat(EL_STR("[\"safety\",\"bell\",\"bell:"), level), EL_STR("\"]"));
|
|
el_val_t node_id = engram_node_full(content, EL_STR("BellEvent"), el_str_concat(EL_STR("bell:"), level), el_from_float(0.95), el_from_float(0.95), el_from_float(1.0), EL_STR("Episodic"), tags);
|
|
if (str_eq(node_id, EL_STR(""))) {
|
|
println(el_str_concat(EL_STR("[safety] WARN: bell event engram write failed -- fallback log: "), content));
|
|
}
|
|
return EL_STR("");
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_self_harm_phrases(void) {
|
|
return EL_STR("[\"kill myself\",\"killing myself\",\"want to die\",\"want to be dead\",\"going to end my life\",\"end my life\",\"take my life\",\"taking my life\",\"suicide\",\"suicidal\",\"can't go on\",\"cannot go on\",\"i have a knife\",\"i have a gun\",\"i have pills\",\"took pills\",\"took too many\",\"overdose\",\"overdosing\",\"self harm\",\"self-harm\",\"cutting myself\",\"hurt myself\",\"hurting myself\",\"no reason to live\",\"not worth living\",\"better off dead\",\"better off without me\"]");
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_abuse_phrases(void) {
|
|
return EL_STR("[\"someone is hurting me\",\"someone's hurting me\",\"someone hurt me\",\"he hit me\",\"she hit me\",\"they hit me\",\"he hurt me\",\"she hurt me\",\"being abused\",\"being hurt by\",\"i am being abused\",\"i'm being abused\",\"i am being hurt\",\"i'm being hurt\",\"domestic violence\",\"my partner hurt\",\"my partner hit\",\"my husband hurt\",\"my wife hurt\",\"my boyfriend hurt\",\"my girlfriend hurt\",\"my parent hurt\",\"my father hurt\",\"my mother hurt\",\"my dad hurt\",\"my mom hurt\",\"afraid of him\",\"afraid of her\",\"afraid to go home\",\"scared of him\",\"scared of her\",\"he threatened me\",\"she threatened me\",\"threatened to hurt me\",\"threatened to kill me\",\"going to hurt me\",\"going to kill me\",\"help me he\",\"help me she\",\"help me they\"]");
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_general_hard_phrases(void) {
|
|
return EL_STR("[\"going to kill\",\"going to hurt\",\"hurting me\",\"being hurt\"]");
|
|
return 0;
|
|
}
|
|
|
|
el_val_t safety_soft_phrases(void) {
|
|
return EL_STR("[\"stressed\",\"overwhelmed\",\"can't cope\",\"cannot cope\",\"struggling\",\"anxious\",\"anxiety\",\"depressed\",\"depression\",\"lonely\",\"isolated\",\"hopeless\",\"hopelessness\",\"exhausted\",\"burnt out\",\"burned out\",\"burnout\",\"panic\",\"panicking\",\"falling apart\",\"breaking down\",\"can't handle\",\"cannot handle\",\"losing it\",\"nothing matters\",\"don't care anymore\",\"given up\",\"giving up\",\"helpless\",\"worthless\",\"useless\",\"hate myself\",\"no one cares\",\"nobody cares\",\"no one understands\",\"nobody understands\",\"empty inside\",\"can't stop crying\",\"breaking point\",\"at my limit\",\"having a breakdown\"");
|
|
EL_NULL;
|
|
EL_STR("\n}\n\n// ISSUE 5 TODO: phrase lists are rebuilt from JSON literals on every call.\n// safety_any_match and safety_count_match loop over json_array_get on every invocation.\n// A compiled/cached representation would reduce per-message overhead and also guard against\n// malformed phrase JSON (json_array_len of malformed input returns 0, silently skipping all checks).\n// Caching requires language-level static const arrays -- not available in current EL.\n// When EL gains module-level const arrays, migrate phrase lists to that form.\n//\n// ISSUE 5 TODO: phrase lists are rebuilt from JSON literals on every call to\n// safety_any_match / safety_count_match. json_array_len of a malformed string\n// returns 0, silently skipping all checks. Caching requires language-level static\n// const arrays (not available in current EL). Migrate when EL gains that feature.\n// \xe2\x94\x80\xe2\x94\x80 Matching helpers (single loops only \xe2\x80\x94 el escapes while-body mutation via\n// top-level let rebinds; nested loops would not advance) \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\nfn safety_normalize(message: String) -> String {\n let lower: String = str_to_lower(message)\n // Normalise the common curly apostrophe to ASCII so ");
|
|
can;
|
|
t;
|
|
EL_STR(" / ");
|
|
i;
|
|
m;
|
|
EL_STR(" match.\n return str_replace(lower, ");
|
|
EL_STR(", ");
|
|
EL_STR(")\n}\n\nfn safety_any_match(text: String, phrases_json: String) -> Bool {\n let n: Int = json_array_len(phrases_json)\n let i: Int = 0\n let found: Bool = false\n while i < n {\n let phrase: String = json_array_get_string(phrases_json, i)\n let found = if str_contains(text, phrase) { true } else { found }\n let i = i + 1\n }\n return found\n}\n\nfn safety_count_match(text: String, phrases_json: String) -> Int {\n let n: Int = json_array_len(phrases_json)\n let i: Int = 0\n let count: Int = 0\n while i < n {\n let phrase: String = json_array_get_string(phrases_json, i)\n let count = if str_contains(text, phrase) { count + 1 } else { count }\n let i = i + 1\n }\n return count\n}\n\n// \xe2\x94\x80\xe2\x94\x80 Public detection API (ports detectBellLevel + classifyHardBell) \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\n// Returns ");
|
|
none;
|
|
EL_STR(" | ");
|
|
soft;
|
|
EL_STR(" | ");
|
|
hard;
|
|
el_get_field(EL_STR(". Hard bell triggers on ANY match (cost of a miss\n// outweighs a false positive). Soft bell needs >= 2 matches to reduce false positives.\nfn safety_positive_phrases() -> String {\n return "), EL_STR("thrilled\",\"so excited\",\"so happy\",\"over the moon\",\"ecstatic\",\"amazing news\",\"great news\",\"fantastic news\",\"wonderful news\",\"incredible news\",\"i got the job\",\"got accepted\",\"got in\",\"we won\",\"i won\",\"we got\",\"just got engaged\",\"getting married\",\"baby is here\",\"she said yes\",\"he said yes\",\"passed the exam\",\"aced it\",\"nailed it\",\"best day\",\"dream come true\",\"milestone\",\"promotion\",\"got promoted\",\"raise\",\"got a raise\",\"celebrating\",\"just graduated\",\"we closed\",\"launched\",\"shipped it\",\"we did it\",\"so proud\",\"proud of myself\",\"proud of us\",\"so grateful\",\"feel amazing\",\"feeling amazing\",\"feel great\",\"feeling great\",\"on top of the world\",\"life is good\",\"couldn't be happier\"]"));
|
|
return 0;
|
|
}
|
|
|