__                 _ _                _
  / _| ___   ___   __| | |__   __ _ _ __| | __
 | |_ / _ \ / _ \ / _` | '_ \ / _` | '__| |/ /
 |  _| (_) | (_) | (_| | |_) | (_| | |  |   <
 |_|  \___/ \___/ \__,_|_.__/ \__,_|_|  |_|\_\

A personal BBS  ·  Missoula, Montana  ·  formerly NaClCON BBS

Connect from your terminal: telnet naclconbbs.net 23  |  ssh naclconbbs.net -p 2222

  • src/sbbs3/chat.cpp js_console.cpp sbbs.h src/sbbs3/scfg/scfgchat.c scf

    From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Fri May 29 00:55:35 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/683147f9c66adf9e7e17c3f5
    Modified Files:
    src/sbbs3/chat.cpp js_console.cpp sbbs.h src/sbbs3/scfg/scfgchat.c scfgindex.h src/sbbs3/scfgdefs.h scfglib2.c scfgsave.c
    Log Message:
    chat.cpp/scfg: dispatch guru paging to a JS module

    Adds infrastructure for a JS-driven guru chat engine, gated on a new
    per-guru "module" config field:

    src/sbbs3/scfgdefs.h new guru_t.module field (LEN_CODE+1)
    src/sbbs3/scfglib2.c read module= from chat.ini's [guru:CODE]
    src/sbbs3/scfgsave.c write module= back to chat.ini
    src/sbbs3/scfg/scfgchat.c "Module" line in SCFG's guru menu + helpbuf
    src/sbbs3/scfg/scfgindex.h register the option in SCFG's option index
    src/sbbs3/sbbs.h declarations for the dispatch methods
    src/sbbs3/chat.cpp dispatch + simulate_type
    src/sbbs3/js_console.cpp console.simulate_type() JS binding

    When cfg.guru[gurunum]->module is empty (the default for every existing install), the legacy guruchat() loop runs unchanged. When module is
    set, sbbs_t::chat_llm_session(gurunum) takes over 1:1 paging by
    load()ing exec/<module>.js and invoking its chat_session(input, ctx)
    function. Channel-guru turns route to chat_llm_multinode_turn() (one-
    shot per user line, no session state).

    Both engines log to data/logs/guru.log in the legacy format, so sysops
    see all guru conversations together regardless of which engine handled
    them.

    Also adds sbbs_t::simulate_type() with optional fat-finger /
    transposition typo simulation, plus a console.simulate_type() JS
    binding (with UTF-8 -> CP437 inplace conversion for non-UTF8
    terminals) so a JS module can stream tokens out as they arrive in the
    streaming response without typing them out of order.

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net