|
8 | 8 | :defs $ {} |
9 | 9 | |*abort-control $ %{} :CodeEntry (:doc |) |
10 | 10 | :code $ quote (defatom *abort-control nil) |
| 11 | + :examples $ [] |
11 | 12 | |*gen-ai-new $ %{} :CodeEntry (:doc |) |
12 | 13 | :code $ quote (defatom *gen-ai-new nil) |
| 14 | + :examples $ [] |
13 | 15 | |*image-cache $ %{} :CodeEntry (:doc |) |
14 | 16 | :code $ quote (defatom *image-cache nil) |
| 17 | + :examples $ [] |
15 | 18 | |*openai $ %{} :CodeEntry (:doc "|called openai sdk, but actually for openrouter") |
16 | 19 | :code $ quote (defatom *openai nil) |
| 20 | + :examples $ [] |
17 | 21 | |call-anthropic-msg! $ %{} :CodeEntry (:doc |) |
18 | 22 | :code $ quote |
19 | 23 | defn call-anthropic-msg! (cursor state prompt-text model thinking? d!) (hint-fn async) |
|
100 | 104 | -> state (assoc :answer @*text) (assoc :loading? false) (assoc :done? false) |
101 | 105 | recur xss |
102 | 106 | recur |
| 107 | + :examples $ [] |
103 | 108 | |call-deepinfra-msg! $ %{} :CodeEntry (:doc |) |
104 | 109 | :code $ quote |
105 | 110 | defn call-deepinfra-msg! (cursor state prompt-text d! *text) (hint-fn async) |
|
164 | 169 | d! $ :: :states cursor |
165 | 170 | -> state (assoc :answer @*text) (assoc :loading? false) (assoc :done? false) |
166 | 171 | recur |
| 172 | + :examples $ [] |
167 | 173 | |call-flash-imagen-msg! $ %{} :CodeEntry (:doc |) |
168 | 174 | :code $ quote |
169 | 175 | defn call-flash-imagen-msg! (variant cursor state prompt-text d!) (hint-fn async) |
|
220 | 226 | -> state (assoc :answer @*text) (assoc :loading? false) (assoc :done? false) |
221 | 227 | d! $ :: :states cursor |
222 | 228 | -> state (assoc :answer @*text) (assoc :loading? false) (assoc :done? true) |
| 229 | + :examples $ [] |
223 | 230 | |call-genai-msg! $ %{} :CodeEntry (:doc |) |
224 | 231 | :code $ quote |
225 | 232 | defn call-genai-msg! (variant cursor state prompt-text search? think? d! *text) (hint-fn async) |
|
292 | 299 | {} (:answer @*text) (:loading? false) (:done? false) |
293 | 300 | d! $ :: :states-merge cursor state |
294 | 301 | {} (:answer @*text) (:loading? false) (:done? true) |
| 302 | + :examples $ [] |
295 | 303 | |call-imagen-3-msg! $ %{} :CodeEntry (:doc |) |
296 | 304 | :code $ quote |
297 | 305 | defn call-imagen-3-msg! (variant cursor state prompt-text d!) (hint-fn async) |
|
335 | 343 | -> state (assoc :answer @*text) (assoc :loading? false) (assoc :done? false) |
336 | 344 | d! $ :: :states cursor |
337 | 345 | -> state (assoc :answer @*text) (assoc :loading? false) (assoc :done? true) |
| 346 | + :examples $ [] |
338 | 347 | |call-openrouter! $ %{} :CodeEntry (:doc |) |
339 | 348 | :code $ quote |
340 | 349 | defn call-openrouter! (cursor state prompt-text variant thinking? d! *text) (hint-fn async) |
|
384 | 393 | {} (:answer @*text) (:loading? false) (:done? false) |
385 | 394 | d! $ :: :states-merge cursor state |
386 | 395 | {} (:answer @*text) (:loading? false) (:done? true) |
| 396 | + :examples $ [] |
387 | 397 | |clear-image-cache! $ %{} :CodeEntry (:doc |) |
388 | 398 | :code $ quote |
389 | 399 | defn clear-image-cache! () $ if-let (url @*image-cache) |
390 | 400 | do (js/URL.revokeObjectURL url) (reset! *image-cache nil) |
| 401 | + :examples $ [] |
391 | 402 | |comp-abort $ %{} :CodeEntry (:doc |) |
392 | 403 | :code $ quote |
393 | 404 | defn comp-abort (t) |
|
402 | 413 | <> t |
403 | 414 | =< 8 nil |
404 | 415 | <> "\"✕" style-abort-close |
| 416 | + :examples $ [] |
405 | 417 | |comp-container $ %{} :CodeEntry (:doc |) |
406 | 418 | :code $ quote |
407 | 419 | defcomp comp-container (reel) |
|
468 | 480 | model-plugin.render |
469 | 481 | if dev? $ comp-reel (>> states :reel) reel ({}) |
470 | 482 | if dev? $ comp-inspect "\"Store" store nil |
| 483 | + :examples $ [] |
471 | 484 | |comp-message-box $ %{} :CodeEntry (:doc |) |
472 | 485 | :code $ quote |
473 | 486 | defcomp comp-message-box (states on-submit) |
|
551 | 564 | :on-click $ fn (e d!) |
552 | 565 | ; println $ :content state |
553 | 566 | on-submit (:content state) (:search? state) (:think? state) d! |
| 567 | + :examples $ [] |
554 | 568 | |effect-focus $ %{} :CodeEntry (:doc |) |
555 | 569 | :code $ quote |
556 | 570 | defeffect effect-focus () (action el at?) |
557 | 571 | when (= action :mount) |
558 | 572 | js/setTimeout $ fn () |
559 | 573 | .!select $ .!querySelector el "\"textarea" |
| 574 | + :examples $ [] |
560 | 575 | |first-line $ %{} :CodeEntry (:doc "|last message from error contains a line starts with \"data: \" and an extra error message. In order that JSON is parsed correctly, only first line is used now.") |
561 | 576 | :code $ quote |
562 | 577 | defn first-line (tt) |
|
568 | 583 | > (.-length lines) 1 |
569 | 584 | js/console.warn "\"Droping some unexpected lines:" $ .!slice lines 1 |
570 | 585 | .-0 lines |
| 586 | + :examples $ [] |
571 | 587 | |get-anthropic-key! $ %{} :CodeEntry (:doc |) |
572 | 588 | :code $ quote |
573 | 589 | defn get-anthropic-key! () $ let |
|
580 | 596 | js/localStorage.setItem "\"claude-key" v |
581 | 597 | , v |
582 | 598 | , key |
| 599 | + :examples $ [] |
583 | 600 | |get-deepinfra-key! $ %{} :CodeEntry (:doc |) |
584 | 601 | :code $ quote |
585 | 602 | defn get-deepinfra-key! () $ let |
|
592 | 609 | js/localStorage.setItem "\"deepinfra-key" v |
593 | 610 | , v |
594 | 611 | , key |
| 612 | + :examples $ [] |
595 | 613 | |get-gemini-key! $ %{} :CodeEntry (:doc |) |
596 | 614 | :code $ quote |
597 | 615 | defn get-gemini-key! () $ let |
|
604 | 622 | js/localStorage.setItem "\"gemini-key" v |
605 | 623 | , v |
606 | 624 | , key |
| 625 | + :examples $ [] |
607 | 626 | |get-openrouter-key! $ %{} :CodeEntry (:doc |) |
608 | 627 | :code $ quote |
609 | 628 | defn get-openrouter-key! () $ let |
|
616 | 635 | js/localStorage.setItem "\"openrouter-key" v |
617 | 636 | , v |
618 | 637 | , key |
| 638 | + :examples $ [] |
619 | 639 | |json-pattern? $ %{} :CodeEntry (:doc |) |
620 | 640 | :code $ quote |
621 | 641 | defn json-pattern? (text) |
622 | 642 | or (.!startsWith text "\"{") (.!startsWith text "\"[") |
| 643 | + :examples $ [] |
623 | 644 | |models-menu $ %{} :CodeEntry (:doc |) |
624 | 645 | :code $ quote |
625 | 646 | def models-menu $ [] (:: :item :gemini-flash "|Gemini Flash 2.5") (:: :item :gemini-flash-lite "|Gemini Flash Lite 2") (:: :item :gemini-pro "|Gemini Pro 2.5") (:: :item :flash-imagen "\"Flash Imagen") (:: :item :imagen-3 "\"Imagen 3") (:: :item :gemma "|Gemma 3 27b") (:: :item :openrouter/anthropic/claude-sonnet-4 "\"Openrouter Claude Sonnet 4") (:: :item :openrouter/anthropic/claude-opus-4 "\"Openrouter Claude Opus 4") (:: :item :openrouter/google/gemini-2.5-pro-preview "\"Openrouter Google Gemini 2.5 pro preview") (:: :item :openrouter/google/gemini-2.5-flash-preview-05-20 "\"Openrouter Google Gemini 2.5 flash preview") (:: :item :openrouter/openai/gpt-4o "\"Openrouter GPT 4o") (:: :item :openrouter/deepseek/deepseek-chat-v3-0324:free "\"Openrouter deepseek-chat-v3-0324:free") (:: :item :claude-3.7 "\"Claude 3.7") (:: :item :deepinfra "\"Deepinfra") (; :: :item :openrouter/anthropic/claude-3.7-sonnet:thinking "\"Openrouter Claude 3.7 Sonnet Thinking") |
| 647 | + :examples $ [] |
626 | 648 | |pattern-spaced-code $ %{} :CodeEntry (:doc |) |
627 | 649 | :code $ quote |
628 | 650 | def pattern-spaced-code $ noted "\"temp fix of nested code block" (&raw-code "\"/\\n\\s+```/g") |
| 651 | + :examples $ [] |
629 | 652 | |pick-model $ %{} :CodeEntry (:doc |) |
630 | 653 | :code $ quote |
631 | 654 | defn pick-model (variant) |
632 | 655 | case-default variant "\"gemini-2.5-flash-preview-05-20" (:gemini-pro "\"gemini-2.5-pro-preview-06-05") (:gemini-pro-1.5 "\"gemini-1.5-pro") (:gemini-flash-lite "\"gemini-2.0-flash-lite") (:gemma "\"gemma-3-27b-it") |
| 656 | + :examples $ [] |
633 | 657 | |style-a-toggler $ %{} :CodeEntry (:doc |) |
634 | 658 | :code $ quote |
635 | 659 | defstyle style-a-toggler $ {} |
636 | 660 | "\"&" $ {} (:cursor :pointer) |
| 661 | + :examples $ [] |
637 | 662 | |style-abort-close $ %{} :CodeEntry (:doc |) |
638 | 663 | :code $ quote |
639 | 664 | defstyle style-abort-close $ {} |
640 | 665 | "\"&" $ {} (:vertical-align :top) (:font-size 10) |
| 666 | + :examples $ [] |
641 | 667 | |style-app-global $ %{} :CodeEntry (:doc |) |
642 | 668 | :code $ quote |
643 | 669 | defstyle style-app-global $ {} |
|
647 | 673 | :background-color $ hsl 0 0 98 |
648 | 674 | "\"&:hover" $ {} (:color "\"#777") |
649 | 675 | :background-color $ hsl 0 0 100 |
| 676 | + :examples $ [] |
650 | 677 | |style-checkbox $ %{} :CodeEntry (:doc |) |
651 | 678 | :code $ quote |
652 | 679 | defstyle style-checkbox $ {} |
653 | 680 | "\"&" $ {} (:cursor :pointer) (:user-select :none) (:font-size 13) |
| 681 | + :examples $ [] |
654 | 682 | |style-clear $ %{} :CodeEntry (:doc |) |
655 | 683 | :code $ quote |
656 | 684 | defstyle style-clear $ {} |
657 | 685 | "\"&" $ {} (:opacity 0.4) (:padding "\"4px 8px") (:display :inline-block) (:height "\"24px") |
| 686 | + :examples $ [] |
658 | 687 | |style-code-content $ %{} :CodeEntry (:doc |) |
659 | 688 | :code $ quote |
660 | 689 | defstyle style-code-content $ {} |
661 | 690 | "\"&" $ {} (:line-height "\"1.5") (:font-size 13) |
| 691 | + :examples $ [] |
662 | 692 | |style-image $ %{} :CodeEntry (:doc |) |
663 | 693 | :code $ quote |
664 | 694 | defstyle style-image $ {} |
665 | 695 | "\"&" $ {} (:max-width "\"100%") (:align-self :flex-start) (:border-radius "\"6px") |
666 | 696 | :border $ str "\"1px solid " (hsl 0 0 90) |
| 697 | + :examples $ [] |
667 | 698 | |style-md-content $ %{} :CodeEntry (:doc |) |
668 | 699 | :code $ quote |
669 | 700 | defstyle style-md-content $ {} |
670 | 701 | "\"& .md-p" $ {} (:margin "\"16px 0") (:line-height "\"1.6") |
| 702 | + :examples $ [] |
671 | 703 | |style-message-area $ %{} :CodeEntry (:doc |) |
672 | 704 | :code $ quote |
673 | 705 | defstyle style-message-area $ {} |
674 | 706 | "\"&" $ {} (:flex 2) (:overflow :scroll) |
| 707 | + :examples $ [] |
675 | 708 | |style-message-box $ %{} :CodeEntry (:doc |) |
676 | 709 | :code $ quote |
677 | 710 | defstyle style-message-box $ {} |
678 | 711 | "\"&" $ {} (:width "\"100%") (:max-width 1200) (:right "\"50%") (:padding "\"8px") (:margin :auto) (:transition-duration "\"300ms") (; :transform "\"translate(50%,0)") (:transition-property "\"height") |
679 | 712 | "\"&:focus-within" $ {} (:opacity 1) (; :transform "\"translate(50%,0)") |
| 713 | + :examples $ [] |
680 | 714 | |style-message-box-panel $ %{} :CodeEntry (:doc |) |
681 | 715 | :code $ quote |
682 | 716 | defstyle style-message-box-panel $ {} |
|
686 | 720 | "\"&.focus-within" $ {} |
687 | 721 | :background-color $ hsl 0 0 100 0.9 |
688 | 722 | :box-shadow $ str "\"0 0px 8px " (hsl 0 0 0 0.3) |
| 723 | + :examples $ [] |
689 | 724 | |style-message-list $ %{} :CodeEntry (:doc |) |
690 | 725 | :code $ quote |
691 | 726 | defstyle style-message-list $ {} |
692 | 727 | "\"&" $ {} (:flex 2) (:padding "\"40px 16px 20vh 16px") (:width "\"100%") (:max-width 1200) (:margin :auto) (:position :relative) |
| 728 | + :examples $ [] |
693 | 729 | |style-more $ %{} :CodeEntry (:doc |) |
694 | 730 | :code $ quote |
695 | 731 | defstyle style-more $ {} |
|
702 | 738 | :display :inline-flex |
703 | 739 | "\"&:hover" $ {} |
704 | 740 | :box-shadow $ str "\"1px 1px 4px " (hsl 0 0 0 0.2) |
| 741 | + :examples $ [] |
705 | 742 | |style-submit $ %{} :CodeEntry (:doc |) |
706 | 743 | :code $ quote |
707 | 744 | defstyle style-submit $ {} |
708 | 745 | "\"&" $ {} |
| 746 | + :examples $ [] |
709 | 747 | |style-textbox $ %{} :CodeEntry (:doc |) |
710 | 748 | :code $ quote |
711 | 749 | defstyle style-textbox $ {} |
712 | 750 | "\"&" $ {} (:border-radius 12) (:height "\"max(160px,20vh)") (:width "\"100%") (:transition-duration "\"320ms") (:border :none) (:background-color :transparent) |
713 | 751 | "\"&.focus-within" $ {} (:height "\"max(240px,32vh)") (:border :none) (:box-shadow :none) |
| 752 | + :examples $ [] |
714 | 753 | |submit-message! $ %{} :CodeEntry (:doc |) |
715 | 754 | :code $ quote |
716 | 755 | defn submit-message! (cursor state prompt-text search? think? model d!) (hint-fn async) |
|
742 | 781 | assoc :answer $ str @*text &newline &newline (str "\"Failed to load: " e) |
743 | 782 | assoc :loading? false |
744 | 783 | assoc :done? true |
| 784 | + :examples $ [] |
745 | 785 | :ns $ %{} :CodeEntry (:doc |) |
746 | 786 | :code $ quote |
747 | 787 | ns app.comp.container $ :require (respo-ui.css :as css) |
|
766 | 806 | |chrome-extension? $ %{} :CodeEntry (:doc |) |
767 | 807 | :code $ quote |
768 | 808 | def chrome-extension? $ and (some? js/window.chrome) (some? js/window.chrome.runtime) (some? js/window.chrome.runtime.id) |
| 809 | + :examples $ [] |
769 | 810 | |dev? $ %{} :CodeEntry (:doc |) |
770 | 811 | :code $ quote |
771 | 812 | def dev? $ = "\"dev" (get-env "\"mode" "\"release") |
| 813 | + :examples $ [] |
772 | 814 | |site $ %{} :CodeEntry (:doc |) |
773 | 815 | :code $ quote |
774 | 816 | def site $ {} (:storage-key "\"msg-buffer") |
| 817 | + :examples $ [] |
775 | 818 | :ns $ %{} :CodeEntry (:doc |) |
776 | 819 | :code $ quote (ns app.config) |
777 | 820 | |app.main $ %{} :FileEntry |
778 | 821 | :defs $ {} |
779 | 822 | |*reel $ %{} :CodeEntry (:doc |) |
780 | 823 | :code $ quote |
781 | 824 | defatom *reel $ -> reel-schema/reel (assoc :base schema/store) (assoc :store schema/store) |
| 825 | + :examples $ [] |
782 | 826 | |dispatch! $ %{} :CodeEntry (:doc |) |
783 | 827 | :code $ quote |
784 | 828 | defn dispatch! (op) |
785 | 829 | when |
786 | 830 | and config/dev? $ not= op :states |
787 | 831 | js/console.log "\"Dispatch:" op |
788 | 832 | reset! *reel $ reel-updater updater @*reel op |
| 833 | + :examples $ [] |
789 | 834 | |listen-extension! $ %{} :CodeEntry (:doc |) |
790 | 835 | :code $ quote |
791 | 836 | defn listen-extension! () |
|
800 | 845 | model $ either (:model store) :gemini |
801 | 846 | submit-message! cursor state0 content false false model dispatch! |
802 | 847 | js/chrome.runtime.connect $ js-object (:name |mySidepanel) |
| 848 | + :examples $ [] |
803 | 849 | |main! $ %{} :CodeEntry (:doc |) |
804 | 850 | :code $ quote |
805 | 851 | defn main! () |
|
818 | 864 | dispatch! $ :: :hydrate-storage (parse-cirru-edn raw) |
819 | 865 | if config/chrome-extension? $ listen-extension! |
820 | 866 | println "|App started." |
| 867 | + :examples $ [] |
821 | 868 | |mount-target $ %{} :CodeEntry (:doc |) |
822 | 869 | :code $ quote |
823 | 870 | def mount-target $ js/document.querySelector |.app |
| 871 | + :examples $ [] |
824 | 872 | |persist-storage! $ %{} :CodeEntry (:doc |) |
825 | 873 | :code $ quote |
826 | 874 | defn persist-storage! () |
827 | 875 | println "\"Saved at" $ .!toISOString (new js/Date) |
828 | 876 | js/localStorage.setItem (:storage-key config/site) |
829 | 877 | format-cirru-edn $ :store @*reel |
| 878 | + :examples $ [] |
830 | 879 | |reload! $ %{} :CodeEntry (:doc |) |
831 | 880 | :code $ quote |
832 | 881 | defn reload! () $ if (nil? build-errors) |
|
835 | 884 | reset! *reel $ refresh-reel @*reel schema/store updater |
836 | 885 | hud! "\"ok~" "\"Ok" |
837 | 886 | hud! "\"error" build-errors |
| 887 | + :examples $ [] |
838 | 888 | |render-app! $ %{} :CodeEntry (:doc |) |
839 | 889 | :code $ quote |
840 | 890 | defn render-app! () $ render! mount-target (comp-container @*reel) dispatch! |
| 891 | + :examples $ [] |
841 | 892 | :ns $ %{} :CodeEntry (:doc |) |
842 | 893 | :code $ quote |
843 | 894 | ns app.main $ :require |
|
859 | 910 | :states $ {} |
860 | 911 | :cursor $ [] |
861 | 912 | :model nil |
| 913 | + :examples $ [] |
862 | 914 | :ns $ %{} :CodeEntry (:doc |) |
863 | 915 | :code $ quote (ns app.schema) |
864 | 916 | |app.updater $ %{} :FileEntry |
|
877 | 929 | assoc store :model :gemini |
878 | 930 | assoc store :model :anthropic |
879 | 931 | _ $ do (eprintln "\"unknown op:" op) store |
| 932 | + :examples $ [] |
880 | 933 | :ns $ %{} :CodeEntry (:doc |) |
881 | 934 | :code $ quote |
882 | 935 | ns app.updater $ :require |
|
0 commit comments