Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Agentic Assistant #1464

Draft
wants to merge 52 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
c56312c
init; 🐙 assistant toggle button created
russell-rozenbaum Jan 17, 2025
9bee1e9
🌒 added sidebar for assistant
russell-rozenbaum Jan 17, 2025
70c90c2
🌒 made sidebar persist, VSCode styling
russell-rozenbaum Jan 18, 2025
30aa4ad
◀️ ▶️ added expand/collapse tab for sidebar (removed toggle). I thi…
russell-rozenbaum Jan 18, 2025
3bebab3
added indicator icon to indicate which tab user is on in sidebar
russell-rozenbaum Jan 19, 2025
f5af748
toggle manual llm/lsp added; begin/end chat button added
russell-rozenbaum Jan 19, 2025
c24fa16
💬 chat bar and send button created; added message list to assistant m…
russell-rozenbaum Jan 19, 2025
915d8c1
implemented switching focus from code editor to text-box when typing …
russell-rozenbaum Jan 20, 2025
1f46fbe
can send message and appeds to chat list in Assistant.Model
russell-rozenbaum Jan 20, 2025
9e688e5
adds a bit more logic for opening/closing sidebar; also begins to imp…
russell-rozenbaum Jan 21, 2025
3db8632
messages now display in chat log; added a datastructure for chat log
russell-rozenbaum Jan 22, 2025
6919fe5
messages now display in chat log; added a datastructure for chat log
russell-rozenbaum Jan 22, 2025
3f33bec
adds resume chat button
russell-rozenbaum Jan 23, 2025
8c18a84
connects LLM to assistant chatbot
russell-rozenbaum Jan 26, 2025
d3f5f95
adds ... while waiting for LLM response
russell-rozenbaum Jan 26, 2025
e37cf9b
fixing build failure
russell-rozenbaum Jan 26, 2025
bf94572
made loading dots prettier
russell-rozenbaum Jan 26, 2025
55c55af
fixes bug with dots; removes autocomplete from input box
russell-rozenbaum Jan 26, 2025
a76dd16
disabled sending a message while the LLM is forming a response
CyrusD123 Jan 26, 2025
e718cca
added cut/copy/pasting in message box
CyrusD123 Jan 31, 2025
3f6c210
port over internals relevany to collating prompt from llama-lsp-looka…
disconcision Feb 1, 2025
5f3e508
cleanup, expose error report in debug console
disconcision Feb 1, 2025
743fe57
ChatLSP for helpful-assistant (#1492)
russell-rozenbaum Feb 4, 2025
e0af80d
tested injecting editor statics. WIP
CyrusD123 Feb 8, 2025
f85d078
LS and LLM chats now appear in sidebar
russell-rozenbaum Feb 9, 2025
964f0ea
prints sketch to sidebar, after LS prompt is printed
russell-rozenbaum Feb 10, 2025
052ce2c
adds ability to collapse/expand long messages. This is currently not …
russell-rozenbaum Feb 11, 2025
e1700d5
fixed up some things in that last push
russell-rozenbaum Feb 11, 2025
a771374
🔑🦉 adds interface and local storage updating allowing use to enter th…
russell-rozenbaum Feb 14, 2025
ae7a851
begins integration of OpenRouter
russell-rozenbaum Feb 14, 2025
dbc63c3
adds a prompt for the LLM, giving it context to the entire conversation
russell-rozenbaum Feb 14, 2025
fb2d4f9
allows use to select from different models; currently has a gemini an…
russell-rozenbaum Feb 14, 2025
daa957a
properly displays current selected chat model in select menu
russell-rozenbaum Feb 14, 2025
d8586bd
adds two more models from OpenRouter
russell-rozenbaum Feb 14, 2025
087802d
adds ?? triggering
russell-rozenbaum Feb 15, 2025
dd70ccc
adds chat collection and displays LLM response when requesting code c…
russell-rozenbaum Feb 15, 2025
d399367
added error rounds and fixed build error
CyrusD123 Feb 16, 2025
7170a9f
implements the removal of ?? once a valid code completion has been fo…
russell-rozenbaum Feb 18, 2025
424610f
suggests llm code; this is kind of buggy in certain cases... neverthe…
russell-rozenbaum Feb 18, 2025
6f01e73
removes error highlighting from ?? or token-holes; gives rainbow anim…
russell-rozenbaum Feb 24, 2025
97784c7
fixes dep cycles through dep inversion; define outer functions to be …
russell-rozenbaum Feb 27, 2025
fc1369b
changes quite a bit of the UI; adds different agent modes (normal cha…
russell-rozenbaum Mar 1, 2025
5397bb5
adds timestamps and deletions of chats; fixes a few bugs with chat lo…
russell-rozenbaum Mar 1, 2025
0c1700d
small styling changes regarding history menu
russell-rozenbaum Mar 1, 2025
a70a51c
fixes bugs with error round chat display
russell-rozenbaum Mar 2, 2025
fea2ad7
checkpointing before I attempt to make significant changes to data st…
russell-rozenbaum Mar 2, 2025
d1073b9
restructured data structure for chats - now uses hash map with UUIDs …
russell-rozenbaum Mar 2, 2025
1ddcbdd
adds resuggest button with limited functionality - code is suggested …
russell-rozenbaum Mar 3, 2025
11934dc
added CoT reasoning for completions
CyrusD123 Mar 5, 2025
15f6a52
adds support for showing/hiding API key
CyrusD123 Mar 6, 2025
a3cc022
added horizontal scroll to sketches in sidebar
CyrusD123 Mar 6, 2025
ee0bfe2
fixes bug where resuggesting deletes character to the left
CyrusD123 Mar 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion src/haz3lcore/assistant/TyDi.re
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,13 @@ let suffix_of = (candidate: Token.t, current: Token.t): option(Token.t) => {
};

/* Returns the text content of the suggestion buffer */
let get_buffer = (z: Zipper.t): option(Token.t) =>
let get_buffer = (z: Zipper.t): option(Token.t) => {
switch (z.selection.mode, z.selection.content) {
| (Buffer(Unparsed), [Tile({label: [completion], _})]) =>
Some(completion)
| _ => None
};
};

/* Populates the suggestion buffer with a type-directed suggestion */
let set_buffer = (~info_map: Statics.Map.t, z: Zipper.t): option(Zipper.t) => {
Expand All @@ -97,3 +98,18 @@ let set_buffer = (~info_map: Statics.Map.t, z: Zipper.t): option(Zipper.t) => {
let z = Zipper.set_buffer(z, ~content, ~mode=Unparsed);
Some(z);
};

let set_llm_buffer =
(~info_map: Statics.Map.t, z: Zipper.t, response: string)
: option(Zipper.t) => {
let* index = Indicated.index(z);
let* ci = Id.Map.find_opt(index, info_map);
let content =
mk_unparsed_buffer(
~sort=Info.sort_of(ci),
z.relatives.siblings,
response,
);
let z = Zipper.set_llm_buffer(z, ~content, ~mode=Unparsed);
Some(z);
};
2 changes: 1 addition & 1 deletion src/haz3lcore/dune
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

(library
(name haz3lcore)
(libraries util sexplib unionFind uuidm virtual_dom yojson core)
(libraries util unix sexplib unionFind uuidm virtual_dom yojson core)
(js_of_ocaml)
(instrumentation
(backend bisect_ppx))
Expand Down
10 changes: 10 additions & 0 deletions src/haz3lcore/lang/Form.re
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,10 @@ let const_mono_delims =
base_typs @ bools @ [undefined, wild, empty_list, empty_tuple, empty_string];

let explicit_hole = "?";
let llm_hole = "??";
let is_explicit_hole = t => t == explicit_hole;

let is_llm_hole = t => t == llm_hole;
let bad_token_cls: string => bad_token_cls =
t =>
switch () {
Expand All @@ -222,6 +225,13 @@ let atomic_forms: list((string, (string => bool, list(Mold.t)))) = [
[mk_op(Exp, []), mk_op(Pat, []), mk_op(Typ, []), mk_op(TPat, [])],
),
),
(
"llm_hole",
(
is_llm_hole,
[mk_op(Exp, []), mk_op(Pat, []), mk_op(Typ, []), mk_op(TPat, [])],
),
),
("wild", (is_wild, [mk_op(Pat, [])])),
("string", (is_string, [mk_op(Exp, []), mk_op(Pat, [])])),
("int_lit", (is_int, [mk_op(Exp, []), mk_op(Pat, [])])),
Expand Down
15 changes: 11 additions & 4 deletions src/haz3lcore/statics/MakeTerm.re
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,8 @@ and exp_term: unsorted => (Exp.term, list(Id.t)) = {
Match(scrut, rules),
ids,
)
| ([t], []) when t != " " && !Form.is_explicit_hole(t) =>
| ([t], [])
when t != " " && !Form.is_explicit_hole(t) && !Form.is_llm_hole(t) =>
ret(Invalid(t))
| _ => ret(hole(tm))
}
Expand Down Expand Up @@ -351,7 +352,9 @@ and pat_term: unsorted => (Pat.term, list(Id.t)) = {
| ([t], []) when Form.is_wild(t) => Wild
| ([t], []) when Form.is_ctr(t) =>
Constructor(t, Unknown(Internal) |> Typ.fresh)
| ([t], []) when t != " " && !Form.is_explicit_hole(t) =>
| ([t], [])
when
t != " " && !Form.is_explicit_hole(t) && !Form.is_llm_hole(t) =>
Invalid(t)
| (["(", ")"], [Pat(body)]) => Parens(body)
| (["[", "]"], [Pat(body)]) =>
Expand Down Expand Up @@ -415,7 +418,9 @@ and typ_term: unsorted => (Typ.term, list(Id.t)) = {
| ([t], []) when Form.is_typ_var(t) => Var(t)
| (["(", ")"], [Typ(body)]) => Parens(body)
| (["[", "]"], [Typ(body)]) => List(body)
| ([t], []) when t != " " && !Form.is_explicit_hole(t) =>
| ([t], [])
when
t != " " && !Form.is_explicit_hole(t) && !Form.is_llm_hole(t) =>
Unknown(Hole(Invalid(t)))
| _ => hole(tm)
},
Expand Down Expand Up @@ -483,7 +488,9 @@ and tpat_term: unsorted => TPat.term = {
ret(
switch (tile) {
| ([t], []) when Form.is_typ_var(t) => Var(t)
| ([t], []) when t != " " && !Form.is_explicit_hole(t) =>
| ([t], [])
when
t != " " && !Form.is_explicit_hole(t) && !Form.is_llm_hole(t) =>
Invalid(t)
| _ => hole(tm)
},
Expand Down
3 changes: 3 additions & 0 deletions src/haz3lcore/zipper/Selection.re
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ let mk = (~mode=Normal, ~focus=Direction.Left, content: Segment.t) => {

let mk_buffer = buffer => mk(~mode=Buffer(buffer), ~focus=Direction.Left);

let mk_llm_buffer = buffer =>
mk(~mode=Buffer(buffer), ~focus=Direction.Right);

let is_buffer: t => bool =
fun
| {mode: Buffer(_), _} => true
Expand Down
5 changes: 5 additions & 0 deletions src/haz3lcore/zipper/Zipper.re
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,11 @@ let set_buffer = (z: t, ~mode: Selection.buffer, ~content: Segment.t): t => {
selection: Selection.mk_buffer(mode, content),
};

let set_llm_buffer = (z: t, ~mode: Selection.buffer, ~content: Segment.t): t => {
...z,
selection: Selection.mk_llm_buffer(mode, content),
};

let is_linebreak_to_right_of_caret =
({relatives: {siblings: (_, r), _}, _}: t): bool => {
switch (r) {
Expand Down
3 changes: 2 additions & 1 deletion src/haz3lcore/zipper/action/Action.re
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ type project =

[@deriving (show({with_path: false}), sexp, yojson)]
type agent =
| TyDi;
| TyDi
| LLMSug(string);

[@deriving (show({with_path: false}), sexp, yojson)]
type buffer =
Expand Down
12 changes: 10 additions & 2 deletions src/haz3lcore/zipper/action/Perform.re
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,18 @@ let buffer_clear = (z: t): t =>
| _ => z
};

let set_buffer = (info_map: Statics.Map.t, z: t): t =>
let set_tydi_buffer = (info_map: Statics.Map.t, z: t): t =>
switch (TyDi.set_buffer(~info_map, z)) {
| None => z
| Some(z) => z
};

let set_llm_buffer = (info_map: Statics.Map.t, z: t, response: string): t =>
switch (TyDi.set_llm_buffer(~info_map, z, response)) {
| None => z
| Some(z) => z
};

let go_z =
(
~settings as _: CoreSettings.t,
Expand Down Expand Up @@ -98,7 +104,9 @@ let go_z =
| None => Error(CantReparse)
| Some(z) => Ok(z)
}
| Buffer(Set(TyDi)) => Ok(set_buffer(statics.info_map, z))
| Buffer(Set(TyDi)) => Ok(set_tydi_buffer(statics.info_map, z))
| Buffer(Set(LLMSug(response))) =>
Ok(set_llm_buffer(statics.info_map, z, response))
| Buffer(Accept) =>
switch (buffer_accept(z)) {
| None => Error(CantAccept)
Expand Down
63 changes: 57 additions & 6 deletions src/haz3lweb/Settings.re
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ module Model = {
instructor_mode: bool,
benchmark: bool,
explainThis: ExplainThisModel.Settings.t,
assistant: AssistantSettings.t,
sidebar: SidebarModel.Settings.t,
};

let init = {
Expand Down Expand Up @@ -38,10 +40,19 @@ module Model = {
instructor_mode: true,
benchmark: false,
explainThis: {
show: true,
show_feedback: false,
highlight: NoHighlight,
},
assistant: {
llm: false,
lsp: false,
ongoing_chat: false,
mode: CodeSuggestion,
},
sidebar: {
window: LanguageDocumentation,
show: true,
},
};

let fix_instructor_mode = settings =>
Expand Down Expand Up @@ -91,7 +102,9 @@ module Update = {
| ContextInspector
| InstructorMode
| Evaluation(evaluation)
| ExplainThis(ExplainThisModel.Settings.action);
| Sidebar(SidebarModel.Settings.action)
| ExplainThis(ExplainThisModel.Settings.action)
| Assistant(AssistantSettings.action);

let update = (action, settings: Model.t): Updated.t(Model.t) => {
(
Expand Down Expand Up @@ -174,11 +187,21 @@ module Update = {
evaluation,
},
};
| ExplainThis(ToggleShow) => {
| Sidebar(ToggleShow) => {
...settings,
explainThis: {
...settings.explainThis,
show: !settings.explainThis.show,
sidebar: {
...settings.sidebar,
show: !settings.sidebar.show,
},
}
| Sidebar(SwitchWindow(windowToSwitchTo)) => {
...settings,
sidebar: {
show:
!settings.sidebar.show
? true
: settings.sidebar.window == windowToSwitchTo ? false : true,
window: windowToSwitchTo,
},
}
| ExplainThis(ToggleShowFeedback) => {
Expand All @@ -200,6 +223,34 @@ module Update = {
};
let explainThis = {...settings.explainThis, highlight};
{...settings, explainThis};
| Assistant(ToggleLLM) => {
...settings,
assistant: {
...settings.assistant,
llm: !settings.assistant.llm,
},
}
| Assistant(ToggleLSP) => {
...settings,
assistant: {
...settings.assistant,
lsp: !settings.assistant.lsp,
},
}
| Assistant(UpdateChatStatus) => {
...settings,
assistant: {
...settings.assistant,
ongoing_chat: !settings.assistant.ongoing_chat,
},
}
| Assistant(SwitchMode(mode)) => {
...settings,
assistant: {
...settings.assistant,
mode,
},
}
| Benchmark => {...settings, benchmark: !settings.benchmark}
| Captions => {...settings, captions: !settings.captions}
| SecondaryIcons => {
Expand Down
16 changes: 16 additions & 0 deletions src/haz3lweb/Store.re
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ open Util;
type key =
| Settings
| ExplainThis
| Assistant
| Mode
| Scratch
| Documentation
Expand All @@ -14,6 +15,7 @@ let key_to_string =
fun
| Settings => "SETTINGS"
| ExplainThis => "ExplainThisModel"
| Assistant => "AssistantModel"
| Mode => "MODE"
| Scratch => "SAVE_SCRATCH"
| Documentation => "SAVE_DOCUMENTATION"
Expand Down Expand Up @@ -69,3 +71,17 @@ module F =
save(data);
};
};

module Generic = {
let prefix: string = "KEY_STORE_";

let full_key = (key: string): string => {
prefix ++ key;
};

let save = (key: string, value: string): unit =>
JsUtil.set_localstore(full_key(key), value);

let load = (key: string): option(string) =>
JsUtil.get_localstore(full_key(key));
};
82 changes: 82 additions & 0 deletions src/haz3lweb/app/common/Icons.re
Original file line number Diff line number Diff line change
Expand Up @@ -231,3 +231,85 @@ let command_palette_sparkle =
"m554.76 426.6c6.5195-23.285 24.715-41.48 48-48-23.297-6.5-41.5-24.707-48-48-6.5 23.293-24.707 41.5-48 48 23.281 6.5195 41.477 24.715 48 48z",
],
);

let assistant =
simple_icon(
~view="0 0 512 512",
[
"M440.86,303.607c-27.106,0-59.31-6.311-68.409-24.022c-5.41-10.534,0.128-22.059,5.728-29.872
c21.037-29.36,32.158-62.108,32.158-94.703C410.336,69.538,341.101,0,255.999,0S101.662,69.538,101.662,155.01
c0,32.595,11.12,65.343,32.158,94.703c5.598,7.813,11.138,19.339,5.728,29.872c-9.099,17.712-41.303,24.022-68.409,24.022
c-30.01,0-54.424,24.497-54.424,54.609s24.415,54.609,54.424,54.609c13.878,0,32.714-3.057,49.694-7.208
c-3.563,2.705-7.187,5.417-10.638,7.91c-21.305,15.39-28.094,40.131-17.718,64.568c6.132,14.441,18.071,25.704,32.76,30.902
c13.514,4.781,27.708,3.827,39.96-2.695c35.939-19.129,59.199-51.213,76.181-74.639c4.617-6.369,10.521-14.513,14.62-19.001
c4.099,4.489,10.003,12.633,14.621,19.001c16.983,23.426,40.242,55.509,76.181,74.639c7.114,3.786,14.882,5.698,22.793,5.698
c5.713,0,11.5-0.997,17.168-3.002c14.688-5.197,26.629-16.46,32.76-30.902c10.375-24.438,3.587-49.178-17.717-64.568
c-3.453-2.493-7.075-5.206-10.639-7.91c16.979,4.15,35.818,7.208,49.694,7.208c30.01,0,54.424-24.497,54.424-54.609
C495.285,328.106,470.87,303.607,440.86,303.607z M204.312,193.512c-11.237,0-20.381-9.291-20.381-20.753
c0-11.463,9.144-20.747,20.381-20.747c11.251,0,20.394,9.284,20.394,20.747C224.706,184.22,215.564,193.512,204.312,193.512z
M307.532,193.666c-11.346,0-20.55-9.36-20.55-20.908c0-11.547,9.204-20.908,20.55-20.908c11.332,0,20.535,9.36,20.535,20.908
C328.067,184.306,318.865,193.666,307.532,193.666z",
],
);

let explain_this =
simple_icon(
~view="0 0 1024 1024",
[
"M263.508 346.359c0-11.782 9.551-21.333 21.333-21.333h303.012c11.78 0 21.333 9.551 21.333 21.333s-9.553 21.333-21.333 21.333H284.841c-11.782 0-21.333-9.551-21.333-21.333zm21.333 92.937c-11.782 0-21.333 9.553-21.333 21.333 0 11.785 9.551 21.333 21.333 21.333h303.012c11.78 0 21.333-9.549 21.333-21.333 0-11.78-9.553-21.333-21.333-21.333H284.841zm-21.333 135.599c0-11.78 9.551-21.333 21.333-21.333h303.012c11.78 0 21.333 9.553 21.333 21.333 0 11.785-9.553 21.333-21.333 21.333H284.841c-11.782 0-21.333-9.549-21.333-21.333zm21.333 92.535c-11.782 0-21.333 9.553-21.333 21.333 0 11.785 9.551 21.333 21.333 21.333h303.012c11.78 0 21.333-9.549 21.333-21.333 0-11.78-9.553-21.333-21.333-21.333H284.841z",
"M325.731 43.151h15.654c1.387-.283 2.823-.432 4.294-.432s2.907.149 4.294.432H654.22c37.875 0 68.74 30.919 68.74 68.78v649.225c0 37.858-30.865 68.779-68.74 68.779H218.073c-37.873 0-68.741-30.921-68.741-68.779V212.754c0-.922.058-1.831.172-2.722.466-11.074 4.843-22.22 13.986-31.371L285.747 56.306c11.501-11.236 26.231-15.109 39.984-13.155zM193.673 208.819L315.626 86.765c.943-.899 1.808-1.238 2.577-1.366.895-.149 1.968-.049 3.028.39 1.055.437 1.833 1.1 2.312 1.78.366.52.73 1.278.803 2.512v70.051c0 .256.004.511.013.765v38.38c0 9.981-8.243 18.205-18.173 18.205H197.149c-1.328 0-2.141-.36-2.728-.777-.686-.486-1.363-1.285-1.806-2.354s-.529-2.115-.384-2.956c.124-.722.455-1.588 1.441-2.575zm173.34-123.001v3.525c.009.399.013.8.013 1.202v108.731c0 33.512-27.312 60.872-60.839 60.872L192 260.151v501.005c0 14.327 11.799 26.112 26.074 26.112h436.147c14.276 0 26.074-11.785 26.074-26.112V111.931c0-14.33-11.797-26.113-26.074-26.113H367.013z",
"M777.485 128.521c-11.785 0-21.333 9.551-21.333 21.333s9.549 21.333 21.333 21.333h28.442c14.276 0 26.074 11.783 26.074 26.113v715.254c0 14.332-11.797 26.112-26.074 26.112H369.78c-14.275 0-26.074-11.785-26.074-26.112v-28.075c0-11.78-9.551-21.333-21.333-21.333s-21.333 9.553-21.333 21.333v28.075c0 37.862 30.868 68.779 68.741 68.779h436.147c37.875 0 68.74-30.916 68.74-68.779V197.3c0-37.861-30.865-68.78-68.74-68.78h-28.442z",
],
);

let expand =
simple_icon(
~view="0 0 24 24",
[
"M8.70710678,12 L19.5,12 C19.7761424,12 20,12.2238576 20,12.5 C20,12.7761424 19.7761424,13 19.5,13 L8.70710678,13 L11.8535534,16.1464466 C12.0488155,16.3417088 12.0488155,16.6582912 11.8535534,16.8535534 C11.6582912,17.0488155 11.3417088,17.0488155 11.1464466,16.8535534 L7.14644661,12.8535534 C6.95118446,12.6582912 6.95118446,12.3417088 7.14644661,12.1464466 L11.1464466,8.14644661 C11.3417088,7.95118446 11.6582912,7.95118446 11.8535534,8.14644661 C12.0488155,8.34170876 12.0488155,8.65829124 11.8535534,8.85355339 L8.70710678,12 L8.70710678,12 Z M4,5.5 C4,5.22385763 4.22385763,5 4.5,5 C4.77614237,5 5,5.22385763 5,5.5 L5,19.5 C5,19.7761424 4.77614237,20 4.5,20 C4.22385763,20 4,19.7761424 4,19.5 L4,5.5 Z",
],
);

let collapse =
simple_icon(
~view="0 0 24 24",
[
"M15.2928932,12 L12.1464466,8.85355339 C11.9511845,8.65829124 11.9511845,8.34170876 12.1464466,8.14644661 C12.3417088,7.95118446 12.6582912,7.95118446 12.8535534,8.14644661 L16.8535534,12.1464466 C17.0488155,12.3417088 17.0488155,12.6582912 16.8535534,12.8535534 L12.8535534,16.8535534 C12.6582912,17.0488155 12.3417088,17.0488155 12.1464466,16.8535534 C11.9511845,16.6582912 11.9511845,16.3417088 12.1464466,16.1464466 L15.2928932,13 L4.5,13 C4.22385763,13 4,12.7761424 4,12.5 C4,12.2238576 4.22385763,12 4.5,12 L15.2928932,12 Z M19,5.5 C19,5.22385763 19.2238576,5 19.5,5 C19.7761424,5 20,5.22385763 20,5.5 L20,19.5 C20,19.7761424 19.7761424,20 19.5,20 C19.2238576,20 19,19.7761424 19,19.5 L19,5.5 Z",
],
);
let send =
simple_icon(
~view="0 0 24 24",
[
"M11.4697 3.46967C11.7626 3.17678 12.2374 3.17678 12.5303 3.46967L18.5303 9.46967C18.8232 9.76256 18.8232 10.2374 18.5303 10.5303C18.2374 10.8232 17.7626 10.8232 17.4697 10.5303L12.75 5.81066L12.75 20C12.75 20.4142 12.4142 20.75 12 20.75C11.5858 20.75 11.25 20.4142 11.25 20L11.25 5.81066L6.53033 10.5303C6.23744 10.8232 5.76256 10.8232 5.46967 10.5303C5.17678 10.2374 5.17678 9.76256 5.46967 9.46967L11.4697 3.46967Z",
],
);

let add =
simple_icon(
~view="0 0 24 24",
[
"M12.75 9C12.75 8.58579 12.4142 8.25 12 8.25C11.5858 8.25 11.25 8.58579 11.25 9L11.25 11.25H9C8.58579 11.25 8.25 11.5858 8.25 12C8.25 12.4142 8.58579 12.75 9 12.75H11.25V15C11.25 15.4142 11.5858 15.75 12 15.75C12.4142 15.75 12.75 15.4142 12.75 15L12.75 12.75H15C15.4142 12.75 15.75 12.4142 15.75 12C15.75 11.5858 15.4142 11.25 15 11.25H12.75V9Z",
"M12 1.25C6.06294 1.25 1.25 6.06294 1.25 12C1.25 17.9371 6.06294 22.75 12 22.75C17.9371 22.75 22.75 17.9371 22.75 12C22.75 6.06294 17.9371 1.25 12 1.25ZM2.75 12C2.75 6.89137 6.89137 2.75 12 2.75C17.1086 2.75 21.25 6.89137 21.25 12C21.25 17.1086 17.1086 21.25 12 21.25C6.89137 21.25 2.75 17.1086 2.75 12Z",
],
);

let history =
simple_icon(
~view="0 0 24 24",
[
"M5.07868 5.06891C8.87402 1.27893 15.0437 1.31923 18.8622 5.13778C22.6824 8.95797 22.7211 15.1313 18.9262 18.9262C15.1312 22.7211 8.95793 22.6824 5.13774 18.8622C2.87389 16.5984 1.93904 13.5099 2.34047 10.5812C2.39672 10.1708 2.775 9.88377 3.18537 9.94002C3.59575 9.99627 3.88282 10.3745 3.82658 10.7849C3.4866 13.2652 4.27782 15.881 6.1984 17.8016C9.44288 21.0461 14.6664 21.0646 17.8655 17.8655C21.0646 14.6664 21.046 9.44292 17.8015 6.19844C14.5587 2.95561 9.33889 2.93539 6.13935 6.12957L6.88705 6.13333C7.30126 6.13541 7.63535 6.47288 7.63327 6.88709C7.63119 7.3013 7.29372 7.63539 6.87951 7.63331L4.33396 7.62052C3.92269 7.61845 3.58981 7.28556 3.58774 6.8743L3.57495 4.32874C3.57286 3.91454 3.90696 3.57707 4.32117 3.57498C4.73538 3.5729 5.07285 3.907 5.07493 4.32121L5.07868 5.06891ZM11.9999 7.24992C12.4141 7.24992 12.7499 7.58571 12.7499 7.99992V11.6893L15.0302 13.9696C15.3231 14.2625 15.3231 14.7374 15.0302 15.0302C14.7373 15.3231 14.2624 15.3231 13.9696 15.0302L11.2499 12.3106V7.99992C11.2499 7.58571 11.5857 7.24992 11.9999 7.24992Z",
],
);

let delete =
simple_icon(
~view="0 0 24 24",
[
"M12 2.75C11.0215 2.75 10.1871 3.37503 9.87787 4.24993C9.73983 4.64047 9.31134 4.84517 8.9208 4.70713C8.53026 4.56909 8.32557 4.1406 8.46361 3.75007C8.97804 2.29459 10.3661 1.25 12 1.25C13.634 1.25 15.022 2.29459 15.5365 3.75007C15.6745 4.1406 15.4698 4.56909 15.0793 4.70713C14.6887 4.84517 14.2602 4.64047 14.1222 4.24993C13.813 3.37503 12.9785 2.75 12 2.75Z",
"M2.75 6C2.75 5.58579 3.08579 5.25 3.5 5.25H20.5001C20.9143 5.25 21.2501 5.58579 21.2501 6C21.2501 6.41421 20.9143 6.75 20.5001 6.75H3.5C3.08579 6.75 2.75 6.41421 2.75 6Z",
"M5.91508 8.45011C5.88753 8.03681 5.53015 7.72411 5.11686 7.75166C4.70356 7.77921 4.39085 8.13659 4.41841 8.54989L4.88186 15.5016C4.96735 16.7844 5.03641 17.8205 5.19838 18.6336C5.36678 19.4789 5.6532 20.185 6.2448 20.7384C6.83639 21.2919 7.55994 21.5307 8.41459 21.6425C9.23663 21.75 10.2751 21.75 11.5607 21.75H12.4395C13.7251 21.75 14.7635 21.75 15.5856 21.6425C16.4402 21.5307 17.1638 21.2919 17.7554 20.7384C18.347 20.185 18.6334 19.4789 18.8018 18.6336C18.9637 17.8205 19.0328 16.7844 19.1183 15.5016L19.5818 8.54989C19.6093 8.13659 19.2966 7.77921 18.8833 7.75166C18.47 7.72411 18.1126 8.03681 18.0851 8.45011L17.6251 15.3492C17.5353 16.6971 17.4712 17.6349 17.3307 18.3405C17.1943 19.025 17.004 19.3873 16.7306 19.6431C16.4572 19.8988 16.083 20.0647 15.391 20.1552C14.6776 20.2485 13.7376 20.25 12.3868 20.25H11.6134C10.2626 20.25 9.32255 20.2485 8.60915 20.1552C7.91715 20.0647 7.54299 19.8988 7.26957 19.6431C6.99616 19.3873 6.80583 19.025 6.66948 18.3405C6.52891 17.6349 6.46488 16.6971 6.37503 15.3492L5.91508 8.45011Z",
"M9.42546 10.2537C9.83762 10.2125 10.2051 10.5132 10.2464 10.9254L10.7464 15.9254C10.7876 16.3375 10.4869 16.7051 10.0747 16.7463C9.66256 16.7875 9.29502 16.4868 9.25381 16.0746L8.75381 11.0746C8.71259 10.6625 9.0133 10.2949 9.42546 10.2537Z",
"M15.2464 11.0746C15.2876 10.6625 14.9869 10.2949 14.5747 10.2537C14.1626 10.2125 13.795 10.5132 13.7538 10.9254L13.2538 15.9254C13.2126 16.3375 13.5133 16.7051 13.9255 16.7463C14.3376 16.7875 14.7051 16.4868 14.7464 16.0746L15.2464 11.0746Z",
],
);
Loading