1
1
mirror of https://github.com/ellie/atuin.git synced 2024-08-18 01:10:37 +03:00

feat(gui): runbooks that run (#2233)

* add initial runbooks frontend

* fix buttons, scroll, add shell support to editor

* work

* some tweaks

* wip - run crate

* functioning executable blocks

* handle resizing, killing ptys

* clear properly on stop

* move terminal to its own component, handle lifecycle better

* fix all build issues

* ffs codespelll

* update lockfile

* clippy is needy once more

* only build pty stuff on mac/linux

* vendor pty handling into desktop

* update lockfile
This commit is contained in:
Ellie Huxtable 2024-07-08 11:17:47 +01:00 committed by GitHub
parent f56a66add9
commit 5b38448733
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 5953 additions and 2787 deletions

View File

@ -1,6 +1,6 @@
[codespell]
# Ref: https://github.com/codespell-project/codespell#using-a-config-file
skip = .git*,*.lock,.codespellrc,CODE_OF_CONDUCT.md
skip = .git*,*.lock,.codespellrc,CODE_OF_CONDUCT.md,ui/pnpm-lock.yaml
check-hidden = true
# ignore-regex =
ignore-words-list = crate,ratatui,inbetween

View File

@ -25,4 +25,4 @@ jobs:
# This is regenerated from commit history
# we cannot rewrite commit history, and I'd rather not correct it
# every time
exclude_file: CHANGELOG.md
exclude_file: CHANGELOG.md,ui/pnpm-lock.yaml

284
Cargo.lock generated
View File

@ -162,7 +162,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -173,7 +173,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -185,15 +185,6 @@ dependencies = [
"num-traits",
]
[[package]]
name = "atomic"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994"
dependencies = [
"bytemuck",
]
[[package]]
name = "atomic-waker"
version = "1.1.2"
@ -503,7 +494,7 @@ dependencies = [
"http 1.1.0",
"http-body 1.0.0",
"http-body-util",
"hyper 1.3.1",
"hyper 1.4.0",
"hyper-util",
"itoa",
"matchit",
@ -574,7 +565,7 @@ dependencies = [
"http 1.1.0",
"http-body 1.0.0",
"http-body-util",
"hyper 1.3.1",
"hyper 1.4.0",
"hyper-util",
"pin-project-lite",
"rustls",
@ -632,9 +623,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.5.0"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
dependencies = [
"serde",
]
@ -669,12 +660,6 @@ version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytemuck"
version = "1.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e"
[[package]]
name = "byteorder"
version = "1.5.0"
@ -695,18 +680,18 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
[[package]]
name = "castaway"
version = "0.2.2"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc"
checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5"
dependencies = [
"rustversion",
]
[[package]]
name = "cc"
version = "1.0.99"
version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695"
checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490"
[[package]]
name = "cfg-if"
@ -735,7 +720,7 @@ dependencies = [
"iana-time-zone",
"num-traits",
"serde",
"windows-targets 0.52.5",
"windows-targets 0.52.6",
]
[[package]]
@ -751,9 +736,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.7"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f"
checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d"
dependencies = [
"clap_builder",
"clap_derive",
@ -761,9 +746,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.7"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f"
checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708"
dependencies = [
"anstream",
"anstyle",
@ -774,9 +759,9 @@ dependencies = [
[[package]]
name = "clap_complete"
version = "4.5.5"
version = "4.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2020fa13af48afc65a9a87335bda648309ab3d154cd03c7ff95b378c7ed39c4"
checksum = "1d598e88f6874d4b888ed40c71efbcbf4076f1dfbae128a08a8c9e45f710605d"
dependencies = [
"clap",
]
@ -793,14 +778,14 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.5"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6"
checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -982,7 +967,7 @@ version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
dependencies = [
"bitflags 2.5.0",
"bitflags 2.6.0",
"crossterm_winapi",
"filedescriptor",
"libc",
@ -1052,7 +1037,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -1076,7 +1061,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -1087,7 +1072,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178"
dependencies = [
"darling_core",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -1205,7 +1190,7 @@ checksum = "27540baf49be0d484d8f0130d7d8da3011c32a44d4fc873368154f1510e574a2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -1246,9 +1231,9 @@ dependencies = [
[[package]]
name = "either"
version = "1.12.0"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
dependencies = [
"serde",
]
@ -1381,7 +1366,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
dependencies = [
"futures-core",
"futures-sink",
"spin 0.9.8",
"spin",
]
[[package]]
@ -1475,7 +1460,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -1740,9 +1725,9 @@ dependencies = [
[[package]]
name = "httparse"
version = "1.9.3"
version = "1.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0e7a4dd27b9476dc40cb050d3632d3bba3a70ddbff012285f7f8559a1e7e545"
checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
[[package]]
name = "httpdate"
@ -1782,9 +1767,9 @@ dependencies = [
[[package]]
name = "hyper"
version = "1.3.1"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d"
checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc"
dependencies = [
"bytes",
"futures-channel",
@ -1829,16 +1814,16 @@ dependencies = [
[[package]]
name = "hyper-util"
version = "0.1.5"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56"
checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956"
dependencies = [
"bytes",
"futures-channel",
"futures-util",
"http 1.1.0",
"http-body 1.0.0",
"hyper 1.3.1",
"hyper 1.4.0",
"pin-project-lite",
"socket2",
"tokio",
@ -2011,11 +1996,11 @@ dependencies = [
[[package]]
name = "lazy_static"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
dependencies = [
"spin 0.5.2",
"spin",
]
[[package]]
@ -2036,7 +2021,7 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
"bitflags 2.5.0",
"bitflags 2.6.0",
"libc",
]
@ -2080,9 +2065,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.21"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "logos"
@ -2105,7 +2090,7 @@ dependencies = [
"proc-macro2",
"quote",
"regex-syntax 0.8.4",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -2221,7 +2206,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -2259,7 +2244,7 @@ checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -2276,9 +2261,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
version = "0.7.3"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae"
checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
"adler",
]
@ -2466,9 +2451,9 @@ dependencies = [
[[package]]
name = "object"
version = "0.36.0"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434"
checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce"
dependencies = [
"memchr",
]
@ -2531,9 +2516,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.5.1",
"redox_syscall 0.5.2",
"smallvec",
"windows-targets 0.52.5",
"windows-targets 0.52.6",
]
[[package]]
@ -2610,7 +2595,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -2715,14 +2700,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
dependencies = [
"proc-macro2",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
name = "proc-macro2"
version = "1.0.85"
version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
dependencies = [
"unicode-ident",
]
@ -2754,7 +2739,7 @@ dependencies = [
"prost",
"prost-types",
"regex",
"syn 2.0.66",
"syn 2.0.68",
"tempfile",
]
@ -2768,7 +2753,7 @@ dependencies = [
"itertools 0.12.1",
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -2881,7 +2866,7 @@ version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d16546c5b5962abf8ce6e2881e722b4e0ae3b6f1a08a26ae3573c55853ca68d3"
dependencies = [
"bitflags 2.5.0",
"bitflags 2.6.0",
"cassowary",
"compact_str",
"crossterm",
@ -2936,11 +2921,11 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.1"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd"
dependencies = [
"bitflags 2.5.0",
"bitflags 2.6.0",
]
[[package]]
@ -3058,7 +3043,7 @@ dependencies = [
"http 1.1.0",
"http-body 1.0.0",
"http-body-util",
"hyper 1.3.1",
"hyper 1.4.0",
"hyper-util",
"ipnet",
"js-sys",
@ -3090,7 +3075,7 @@ dependencies = [
"cfg-if",
"getrandom",
"libc",
"spin 0.9.8",
"spin",
"untrusted",
"windows-sys 0.52.0",
]
@ -3183,7 +3168,7 @@ version = "0.38.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
dependencies = [
"bitflags 2.5.0",
"bitflags 2.6.0",
"errno",
"libc",
"linux-raw-sys",
@ -3344,7 +3329,7 @@ version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0"
dependencies = [
"bitflags 2.5.0",
"bitflags 2.6.0",
"core-foundation",
"core-foundation-sys",
"libc",
@ -3384,14 +3369,14 @@ checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
name = "serde_json"
version = "1.0.119"
version = "1.0.120"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8eddb61f0697cc3989c5d64b452f5488e2b8a60fd7d5076a3045076ffef8cb0"
checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
dependencies = [
"itoa",
"ryu",
@ -3432,9 +3417,9 @@ dependencies = [
[[package]]
name = "serde_with"
version = "3.8.1"
version = "3.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20"
checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377"
dependencies = [
"base64 0.22.1",
"chrono",
@ -3450,14 +3435,14 @@ dependencies = [
[[package]]
name = "serde_with_macros"
version = "3.8.1"
version = "3.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2"
checksum = "b80d3d6b56b64335c0180e5ffde23b3c5e08c14c585b51a15bd0e95393f46703"
dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -3571,12 +3556,6 @@ dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "spin"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]]
name = "spin"
version = "0.9.8"
@ -3720,7 +3699,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
dependencies = [
"atoi",
"base64 0.21.7",
"bitflags 2.5.0",
"bitflags 2.6.0",
"byteorder",
"bytes",
"crc",
@ -3764,7 +3743,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
dependencies = [
"atoi",
"base64 0.21.7",
"bitflags 2.5.0",
"bitflags 2.6.0",
"byteorder",
"crc",
"dotenvy",
@ -3824,12 +3803,12 @@ dependencies = [
[[package]]
name = "stability"
version = "0.2.0"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ff9eaf853dec4c8802325d8b6d3dffa86cc707fd7a1a4cdbf416e13b061787a"
checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac"
dependencies = [
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -3863,9 +3842,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "strum"
version = "0.26.2"
version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29"
checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
dependencies = [
"strum_macros",
]
@ -3880,14 +3859,14 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
name = "subtle"
version = "2.5.0"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
@ -3902,9 +3881,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.66"
version = "2.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9"
dependencies = [
"proc-macro2",
"quote",
@ -3998,7 +3977,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -4065,9 +4044,9 @@ dependencies = [
[[package]]
name = "tinyvec"
version = "1.6.0"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82"
dependencies = [
"tinyvec_macros",
]
@ -4115,7 +4094,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -4198,7 +4177,7 @@ dependencies = [
"proc-macro2",
"prost-build",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -4238,7 +4217,7 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
dependencies = [
"bitflags 2.5.0",
"bitflags 2.6.0",
"bytes",
"http 1.1.0",
"http-body 1.0.0",
@ -4281,7 +4260,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -4372,7 +4351,7 @@ checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -4477,11 +4456,10 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
version = "1.9.0"
version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ea73390fe27785838dcbf75b91b1d84799e28f1ce71e6f372a5dc2200c80de5"
checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439"
dependencies = [
"atomic",
"getrandom",
"serde",
]
@ -4546,7 +4524,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
"wasm-bindgen-shared",
]
@ -4580,7 +4558,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@ -4715,7 +4693,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
dependencies = [
"windows-core",
"windows-targets 0.52.5",
"windows-targets 0.52.6",
]
[[package]]
@ -4724,7 +4702,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets 0.52.5",
"windows-targets 0.52.6",
]
[[package]]
@ -4742,7 +4720,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.5",
"windows-targets 0.52.6",
]
[[package]]
@ -4762,18 +4740,18 @@ dependencies = [
[[package]]
name = "windows-targets"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm 0.52.5",
"windows_aarch64_msvc 0.52.5",
"windows_i686_gnu 0.52.5",
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
"windows_i686_gnullvm",
"windows_i686_msvc 0.52.5",
"windows_x86_64_gnu 0.52.5",
"windows_x86_64_gnullvm 0.52.5",
"windows_x86_64_msvc 0.52.5",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
[[package]]
@ -4784,9 +4762,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
@ -4796,9 +4774,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
@ -4808,15 +4786,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
@ -4826,9 +4804,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
@ -4838,9 +4816,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
@ -4850,9 +4828,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
@ -4862,9 +4840,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winreg"
@ -4949,22 +4927,22 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
[[package]]
name = "zerocopy"
version = "0.7.34"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.7.34"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]
[[package]]
@ -4984,5 +4962,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.66",
"syn 2.0.68",
]

471
ui/backend/Cargo.lock generated
View File

@ -152,6 +152,12 @@ dependencies = [
"password-hash",
]
[[package]]
name = "arrayvec"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]]
name = "async-broadcast"
version = "0.7.1"
@ -328,12 +334,6 @@ dependencies = [
"num-traits",
]
[[package]]
name = "atomic"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba"
[[package]]
name = "atomic-waker"
version = "1.1.2"
@ -342,7 +342,7 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "atuin-client"
version = "18.3.0"
version = "18.4.0-beta.1"
dependencies = [
"async-trait",
"atuin-common",
@ -390,10 +390,12 @@ dependencies = [
[[package]]
name = "atuin-common"
version = "18.3.0"
version = "18.4.0-beta.1"
dependencies = [
"base64 0.22.1",
"directories",
"eyre",
"getrandom 0.2.15",
"lazy_static",
"rand 0.8.5",
"semver",
@ -408,7 +410,7 @@ dependencies = [
[[package]]
name = "atuin-dotfiles"
version = "0.3.0"
version = "0.4.0"
dependencies = [
"atuin-client",
"atuin-common",
@ -422,7 +424,7 @@ dependencies = [
[[package]]
name = "atuin-history"
version = "0.2.0"
version = "0.3.0"
dependencies = [
"async-trait",
"atuin-client",
@ -504,6 +506,21 @@ dependencies = [
"serde",
]
[[package]]
name = "bit-set"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
dependencies = [
"bit-vec",
]
[[package]]
name = "bit-vec"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
[[package]]
name = "bitflags"
version = "1.3.2"
@ -779,7 +796,8 @@ dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
"strsim 0.11.1",
"terminal_size",
]
[[package]]
@ -846,6 +864,26 @@ dependencies = [
"memchr",
]
[[package]]
name = "comrak"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0436149c9f6a1935b13306206c739b1ba84fa81f551b5eb87fc2ca7a13700af"
dependencies = [
"clap",
"derive_builder",
"entities",
"memchr",
"once_cell",
"regex",
"shell-words",
"slug",
"syntect",
"typed-arena",
"unicode_categories",
"xdg",
]
[[package]]
name = "concurrent-queue"
version = "2.5.0"
@ -1155,14 +1193,38 @@ dependencies = [
"syn 2.0.66",
]
[[package]]
name = "darling"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
dependencies = [
"darling_core 0.14.4",
"darling_macro 0.14.4",
]
[[package]]
name = "darling"
version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1"
dependencies = [
"darling_core",
"darling_macro",
"darling_core 0.20.9",
"darling_macro 0.20.9",
]
[[package]]
name = "darling_core"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim 0.10.0",
"syn 1.0.109",
]
[[package]]
@ -1175,17 +1237,28 @@ dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim",
"strsim 0.11.1",
"syn 2.0.66",
]
[[package]]
name = "darling_macro"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
dependencies = [
"darling_core 0.14.4",
"quote",
"syn 1.0.109",
]
[[package]]
name = "darling_macro"
version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178"
dependencies = [
"darling_core",
"darling_core 0.20.9",
"quote",
"syn 2.0.66",
]
@ -1228,6 +1301,37 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "derive_builder"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
dependencies = [
"derive_builder_macro",
]
[[package]]
name = "derive_builder_core"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
dependencies = [
"darling 0.14.4",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "derive_builder_macro"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
dependencies = [
"derive_builder_core",
"syn 1.0.109",
]
[[package]]
name = "derive_more"
version = "0.99.17"
@ -1241,6 +1345,12 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "deunicode"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00"
[[package]]
name = "digest"
version = "0.10.7"
@ -1359,6 +1469,12 @@ version = "0.15.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
[[package]]
name = "downcast-rs"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]]
name = "dpi"
version = "0.1.1"
@ -1469,6 +1585,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
[[package]]
name = "entities"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca"
[[package]]
name = "enumflags2"
version = "0.7.10"
@ -1554,6 +1676,16 @@ dependencies = [
"once_cell",
]
[[package]]
name = "fancy-regex"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2"
dependencies = [
"bit-set",
"regex",
]
[[package]]
name = "fastrand"
version = "2.1.0"
@ -1581,7 +1713,7 @@ version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
dependencies = [
"memoffset",
"memoffset 0.9.1",
"rustc_version",
]
@ -2657,12 +2789,40 @@ dependencies = [
"time",
]
[[package]]
name = "ioctl-rs"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7970510895cee30b3e9128319f2cefd4bde883a39f38baa279567ba3a7eb97d"
dependencies = [
"libc",
]
[[package]]
name = "ipnet"
version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
[[package]]
name = "is-docker"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
dependencies = [
"once_cell",
]
[[package]]
name = "is-wsl"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
dependencies = [
"is-docker",
"once_cell",
]
[[package]]
name = "is_terminal_polyfill"
version = "1.70.0"
@ -3022,6 +3182,15 @@ version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
[[package]]
name = "memoffset"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
dependencies = [
"autocfg",
]
[[package]]
name = "memoffset"
version = "0.9.1"
@ -3125,6 +3294,20 @@ version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]]
name = "nix"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4"
dependencies = [
"autocfg",
"bitflags 1.3.2",
"cfg-if",
"libc",
"memoffset 0.6.5",
"pin-utils",
]
[[package]]
name = "nix"
version = "0.27.1"
@ -3134,7 +3317,19 @@ dependencies = [
"bitflags 2.5.0",
"cfg-if",
"libc",
"memoffset",
"memoffset 0.9.1",
]
[[package]]
name = "nix"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [
"bitflags 2.5.0",
"cfg-if",
"cfg_aliases",
"libc",
]
[[package]]
@ -3442,6 +3637,17 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "open"
version = "5.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5ca541f22b1c46d4bb9801014f234758ab4297e7870b904b6a8415b980a7388"
dependencies = [
"is-wsl",
"libc",
"pathdiff",
]
[[package]]
name = "openssl-probe"
version = "0.1.5"
@ -3464,6 +3670,16 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "os_pipe"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29d73ba8daf8fac13b0501d1abeddcfe21ba7401ada61a819144b6c2a4f32209"
dependencies = [
"libc",
"windows-sys 0.52.0",
]
[[package]]
name = "overload"
version = "0.1.1"
@ -3840,6 +4056,27 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
[[package]]
name = "portable-pty"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "806ee80c2a03dbe1a9fb9534f8d19e4c0546b790cde8fd1fea9d6390644cb0be"
dependencies = [
"anyhow",
"bitflags 1.3.2",
"downcast-rs",
"filedescriptor",
"lazy_static",
"libc",
"log",
"nix 0.25.1",
"serial",
"shared_library",
"shell-words",
"winapi",
"winreg 0.10.1",
]
[[package]]
name = "powerfmt"
version = "0.2.0"
@ -4605,9 +4842,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.117"
version = "1.0.120"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
dependencies = [
"itoa 1.0.11",
"ryu",
@ -4680,12 +4917,54 @@ version = "3.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2"
dependencies = [
"darling",
"darling 0.20.9",
"proc-macro2",
"quote",
"syn 2.0.66",
]
[[package]]
name = "serial"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1237a96570fc377c13baa1b88c7589ab66edced652e43ffb17088f003db3e86"
dependencies = [
"serial-core",
"serial-unix",
"serial-windows",
]
[[package]]
name = "serial-core"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581"
dependencies = [
"libc",
]
[[package]]
name = "serial-unix"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7"
dependencies = [
"ioctl-rs",
"libc",
"serial-core",
"termios",
]
[[package]]
name = "serial-windows"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15c6d3b776267a75d31bbdfd5d36c0ca051251caafc285827052bc53bcdc8162"
dependencies = [
"libc",
"serial-core",
]
[[package]]
name = "serialize-to-javascript"
version = "0.1.1"
@ -4749,6 +5028,32 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "shared_child"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef"
dependencies = [
"libc",
"winapi",
]
[[package]]
name = "shared_library"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11"
dependencies = [
"lazy_static",
"libc",
]
[[package]]
name = "shell-words"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
[[package]]
name = "shellexpand"
version = "3.1.0"
@ -4819,6 +5124,16 @@ dependencies = [
"autocfg",
]
[[package]]
name = "slug"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4"
dependencies = [
"deunicode",
"wasm-bindgen",
]
[[package]]
name = "smallvec"
version = "1.13.2"
@ -5194,6 +5509,12 @@ dependencies = [
"unicode-properties",
]
[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "strsim"
version = "0.11.1"
@ -5264,6 +5585,7 @@ checksum = "874dcfa363995604333cf947ae9f751ca3af4522c60886774c4963943b4746b1"
dependencies = [
"bincode",
"bitflags 1.3.2",
"fancy-regex",
"flate2",
"fnv",
"once_cell",
@ -5552,6 +5874,27 @@ dependencies = [
"urlpattern",
]
[[package]]
name = "tauri-plugin-shell"
version = "2.0.0-beta.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8675bf7ab71f571a99192d0685ae870eb7af1264bdbbb66a1d655609f6c7ebd"
dependencies = [
"encoding_rs",
"log",
"open",
"os_pipe",
"regex",
"schemars",
"serde",
"serde_json",
"shared_child",
"tauri",
"tauri-plugin",
"thiserror",
"tokio",
]
[[package]]
name = "tauri-plugin-single-instance"
version = "2.0.0-beta.9"
@ -5696,6 +6039,25 @@ dependencies = [
"utf-8",
]
[[package]]
name = "terminal_size"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
dependencies = [
"rustix",
"windows-sys 0.48.0",
]
[[package]]
name = "termios"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a"
dependencies = [
"libc",
]
[[package]]
name = "thin-slice"
version = "0.1.1"
@ -6067,6 +6429,12 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "typed-arena"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
[[package]]
name = "typed-builder"
version = "0.18.2"
@ -6099,7 +6467,7 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"
dependencies = [
"memoffset",
"memoffset 0.9.1",
"tempfile",
"winapi",
]
@ -6112,7 +6480,11 @@ dependencies = [
"atuin-common",
"atuin-dotfiles",
"atuin-history",
"bytes",
"comrak",
"eyre",
"nix 0.29.0",
"portable-pty",
"serde",
"serde_json",
"sqlx",
@ -6120,11 +6492,13 @@ dependencies = [
"tauri",
"tauri-build",
"tauri-plugin-http",
"tauri-plugin-shell",
"tauri-plugin-single-instance",
"tauri-plugin-sql",
"time",
"tokio",
"uuid",
"vt100",
]
[[package]]
@ -6286,11 +6660,10 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
version = "1.8.0"
version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0"
checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439"
dependencies = [
"atomic",
"getrandom 0.2.15",
"serde",
]
@ -6339,6 +6712,39 @@ dependencies = [
"libc",
]
[[package]]
name = "vt100"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274de"
dependencies = [
"itoa 1.0.11",
"log",
"unicode-width",
"vte",
]
[[package]]
name = "vte"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197"
dependencies = [
"arrayvec",
"utf8parse",
"vte_generate_state_changes",
]
[[package]]
name = "vte_generate_state_changes"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e"
dependencies = [
"proc-macro2",
"quote",
]
[[package]]
name = "walkdir"
version = "2.5.0"
@ -6974,6 +7380,15 @@ dependencies = [
"memchr",
]
[[package]]
name = "winreg"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
dependencies = [
"winapi",
]
[[package]]
name = "winreg"
version = "0.50.0"
@ -7069,6 +7484,12 @@ dependencies = [
"pkg-config",
]
[[package]]
name = "xdg"
version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546"
[[package]]
name = "xdg-home"
version = "1.2.0"
@ -7135,7 +7556,7 @@ dependencies = [
"futures-sink",
"futures-util",
"hex",
"nix",
"nix 0.27.1",
"ordered-stream",
"rand 0.8.5",
"serde",

View File

@ -27,6 +27,12 @@ syntect = "5.2.0"
tauri-plugin-http = "2.0.0-beta"
tauri-plugin-single-instance = "2.0.0-beta"
tokio = "1.38.0"
tauri-plugin-shell = "2.0.0-beta.7"
comrak = "0.22"
portable-pty = "0.8.1"
vt100 = "0.15.2"
bytes = "1.6.0"
nix = "0.29.0"
[dependencies.sqlx]
version = "0.7"

View File

@ -11,6 +11,7 @@
"resources:default",
"menu:default",
"tray:default",
"shell:allow-open",
"sql:allow-load",
"sql:allow-execute",
"sql:allow-select",

View File

@ -1,2 +1,2 @@
[toolchain]
channel = "1.77"
channel = "1.79"

View File

@ -174,6 +174,41 @@ impl HistoryDB {
Ok(history)
}
pub async fn prefix_search(&self, query: &str) -> Result<Vec<UIHistory>, String> {
let context = Context {
session: "".to_string(),
cwd: "".to_string(),
host_id: "".to_string(),
hostname: "".to_string(),
git_root: None,
};
let filters = OptFilters {
limit: Some(5),
..OptFilters::default()
};
let history = self
.0
.search(
SearchMode::Prefix,
FilterMode::Global,
&context,
query,
filters,
)
.await
.map_err(|e| e.to_string())?;
let history = history
.into_iter()
.filter(|h| h.duration > 0)
.map(|h| h.into())
.collect();
Ok(history)
}
pub async fn calendar(&self) -> Result<Vec<(String, u64)>, String> {
let query = "select count(1) as count, strftime('%F', datetime(timestamp / 1000000000, 'unixepoch')) as day from history where timestamp > ((unixepoch() - 31536000) * 1000000000) group by day;";

View File

@ -24,7 +24,8 @@ pub(crate) async fn install_cli() -> Result<(), String> {
pub(crate) async fn is_cli_installed() -> Result<bool, String> {
let shell = Shell::default_shell().map_err(|e| format!("Failed to get default shell: {e}"))?;
let output = if shell == Shell::Powershell {
shell.run_interactive(&["atuin --version; if ($?) {echo 'ATUIN FOUND'}"])
shell
.run_interactive(&["atuin --version; if ($?) {echo 'ATUIN FOUND'}"])
.map_err(|e| format!("Failed to run interactive command"))?
} else {
shell

View File

@ -1,6 +1,8 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use tauri::State;
use std::path::PathBuf;
use tauri::{AppHandle, Manager};
@ -9,6 +11,9 @@ use time::format_description::well_known::Rfc3339;
mod db;
mod dotfiles;
mod install;
mod pty;
mod run;
mod state;
mod store;
use atuin_client::settings::Settings;
@ -168,7 +173,7 @@ async fn home_info() -> Result<HomeInfo, String> {
}
// Match the format that the frontend library we use expects
// All the processing in Rust, not JS.
// All the processing in Rust, not JSunwrap.
// Faaaassssssst af ⚡️🦀
#[derive(Debug, serde::Serialize)]
pub struct HistoryCalendarDay {
@ -215,6 +220,19 @@ async fn history_calendar() -> Result<Vec<HistoryCalendarDay>, String> {
Ok(ret)
}
#[tauri::command]
async fn prefix_search(query: &str) -> Result<Vec<String>, String> {
let settings = Settings::new().map_err(|e| e.to_string())?;
let db_path = PathBuf::from(settings.db_path.as_str());
let db = HistoryDB::new(db_path, settings.local_timeout).await?;
let history = db.prefix_search(query).await?;
let commands = history.into_iter().map(|h| h.command).collect();
Ok(commands)
}
fn show_window(app: &AppHandle) {
let windows = app.webview_windows();
@ -228,9 +246,11 @@ fn show_window(app: &AppHandle) {
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
.invoke_handler(tauri::generate_handler![
list,
search,
prefix_search,
global_stats,
aliases,
home_info,
@ -239,6 +259,10 @@ fn main() {
login,
register,
history_calendar,
run::pty::pty_open,
run::pty::pty_write,
run::pty::pty_resize,
run::pty::pty_kill,
install::install_cli,
install::is_cli_installed,
install::setup_cli,
@ -254,6 +278,7 @@ fn main() {
.plugin(tauri_plugin_single_instance::init(|app, args, cwd| {
let _ = show_window(app);
}))
.manage(state::AtuinState::default())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

112
ui/backend/src/pty.rs Normal file
View File

@ -0,0 +1,112 @@
use std::{
io::Write,
sync::{Arc, Mutex},
};
use bytes::Bytes;
use eyre::{eyre, Result};
use portable_pty::{CommandBuilder, MasterPty, PtySize};
pub struct Pty {
tx: tokio::sync::mpsc::Sender<Bytes>,
pub master: Arc<Mutex<Box<dyn MasterPty + Send>>>,
pub reader: Arc<Mutex<Box<dyn std::io::Read + Send>>>,
}
impl Pty {
pub async fn open<'a>(rows: u16, cols: u16) -> Result<Self> {
let sys = portable_pty::native_pty_system();
let pair = sys
.openpty(PtySize {
rows,
cols,
pixel_width: 0,
pixel_height: 0,
})
.map_err(|e| eyre!("Failed to open pty: {}", e))?;
let cmd = CommandBuilder::new_default_prog();
tokio::task::spawn_blocking(move || {
let mut child = pair.slave.spawn_command(cmd).unwrap();
// Wait for the child to exit
let _ = child.wait().unwrap();
// Ensure slave is dropped
// This closes file handles, we can deadlock if this is not done correctly.
drop(pair.slave);
});
// Handle input -> write to master writer
let (master_tx, mut master_rx) = tokio::sync::mpsc::channel::<Bytes>(32);
let mut writer = pair.master.take_writer().unwrap();
let reader = pair
.master
.try_clone_reader()
.map_err(|e| e.to_string())
.expect("Failed to clone reader");
tokio::spawn(async move {
while let Some(bytes) = master_rx.recv().await {
writer.write_all(&bytes).unwrap();
writer.flush().unwrap();
}
// When the channel has been closed, we won't be getting any more input. Close the
// writer and the master.
// This will also close the writer, which sends EOF to the underlying shell. Ensuring
// that is also closed.
drop(writer);
});
Ok(Pty {
tx: master_tx,
master: Arc::new(Mutex::new(pair.master)),
reader: Arc::new(Mutex::new(reader)),
})
}
pub async fn resize(&self, rows: u16, cols: u16) -> Result<()> {
let master = self
.master
.lock()
.map_err(|e| eyre!("Failed to lock pty master: {e}"))?;
master
.resize(PtySize {
rows,
cols,
pixel_width: 0,
pixel_height: 0,
})
.map_err(|e| eyre!("Failed to resize terminal: {e}"))?;
Ok(())
}
pub async fn send_bytes(&self, bytes: Bytes) -> Result<()> {
self.tx
.send(bytes)
.await
.map_err(|e| eyre!("Failed to write to master tx: {}", e))
}
pub async fn send_string(&self, cmd: &str) -> Result<()> {
let bytes: Vec<u8> = cmd.bytes().collect();
let bytes = Bytes::from(bytes);
self.send_bytes(bytes).await
}
pub async fn send_single_string(&self, cmd: &str) -> Result<()> {
let mut bytes: Vec<u8> = cmd.bytes().collect();
bytes.push(0x04);
let bytes = Bytes::from(bytes);
self.send_bytes(bytes).await
}
}

View File

@ -0,0 +1 @@
pub mod pty;

93
ui/backend/src/run/pty.rs Normal file
View File

@ -0,0 +1,93 @@
use eyre::{Result, WrapErr};
use std::io::BufRead;
use std::path::PathBuf;
use crate::state::AtuinState;
use tauri::{Manager, State};
use atuin_client::{database::Sqlite, record::sqlite_store::SqliteStore, settings::Settings};
#[tauri::command]
pub async fn pty_open<'a>(
app: tauri::AppHandle,
state: State<'a, AtuinState>,
) -> Result<uuid::Uuid, String> {
let id = uuid::Uuid::new_v4();
let pty = crate::pty::Pty::open(24, 80).await.unwrap();
let reader = pty.reader.clone();
tauri::async_runtime::spawn_blocking(move || loop {
let mut buf = [0u8; 512];
match reader.lock().unwrap().read(&mut buf) {
// EOF
Ok(0) => {
println!("reader loop hit eof");
break;
}
Ok(n) => {
println!("read {n} bytes");
// TODO: sort inevitable encoding issues
let out = String::from_utf8_lossy(&buf).to_string();
let out = out.trim_matches(char::from(0));
let channel = format!("pty-{id}");
app.emit(channel.as_str(), out).unwrap();
}
Err(e) => {
println!("failed to read: {e}");
break;
}
}
});
state.pty_sessions.write().await.insert(id, pty);
Ok(id)
}
#[tauri::command]
pub(crate) async fn pty_write(
pid: uuid::Uuid,
data: String,
state: tauri::State<'_, AtuinState>,
) -> Result<(), String> {
let sessions = state.pty_sessions.read().await;
let pty = sessions.get(&pid).ok_or("Pty not found")?;
let bytes = data.as_bytes().to_vec();
pty.send_bytes(bytes.into())
.await
.map_err(|e| e.to_string())?;
Ok(())
}
#[tauri::command]
pub(crate) async fn pty_resize(
pid: uuid::Uuid,
rows: u16,
cols: u16,
state: tauri::State<'_, AtuinState>,
) -> Result<(), String> {
let sessions = state.pty_sessions.read().await;
let pty = sessions.get(&pid).ok_or("Pty not found")?;
pty.resize(rows, cols).await.map_err(|e| e.to_string())?;
Ok(())
}
#[tauri::command]
pub(crate) async fn pty_kill(
pid: uuid::Uuid,
state: tauri::State<'_, AtuinState>,
) -> Result<(), String> {
let pty = state.pty_sessions.write().await.remove(&pid).unwrap();
println!("RIP {pid:?}");
Ok(())
}

10
ui/backend/src/state.rs Normal file
View File

@ -0,0 +1,10 @@
use std::collections::HashMap;
use std::sync::Mutex;
use tauri::async_runtime::RwLock;
use crate::pty::Pty;
#[derive(Default)]
pub(crate) struct AtuinState {
pub pty_sessions: RwLock<HashMap<uuid::Uuid, Pty>>,
}

View File

@ -10,6 +10,16 @@
"tauri": "tauri"
},
"dependencies": {
"@blocknote/core": "^0.14.2",
"@blocknote/mantine": "^0.14.2",
"@blocknote/react": "^0.14.2",
"@codemirror/autocomplete": "^6.16.3",
"@codemirror/commands": "^6.6.0",
"@codemirror/language": "^6.10.2",
"@codemirror/lint": "^6.8.1",
"@codemirror/search": "^6.5.6",
"@codemirror/state": "^6.4.1",
"@codemirror/view": "^6.28.2",
"@headlessui/react": "^2.1.1",
"@heroicons/react": "^2.1.4",
"@radix-ui/react-dialog": "^1.1.1",
@ -21,7 +31,13 @@
"@tanstack/react-virtual": "^3.5.1",
"@tauri-apps/api": "2.0.0-beta.13",
"@tauri-apps/plugin-http": "2.0.0-beta.5",
"@tauri-apps/plugin-shell": "2.0.0-beta.6",
"@tauri-apps/plugin-sql": "2.0.0-beta.5",
"@uiw/codemirror-extensions-langs": "^4.22.2",
"@uiw/react-codemirror": "^4.22.2",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-webgl": "^0.18.0",
"@xterm/xterm": "^5.5.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"core": "link:@tauri-apps/api/core",

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,9 @@ import {
ClockIcon,
WrenchScrewdriverIcon,
} from "@heroicons/react/24/outline";
import { ChevronRightSquare } from "lucide-react";
import Logo from "./assets/logo-light.svg";
function classNames(...classes: any) {
@ -23,11 +26,13 @@ import Home from "./pages/Home.tsx";
import History from "./pages/History.tsx";
import Dotfiles from "./pages/Dotfiles.tsx";
import LoginOrRegister from "./components/LoginOrRegister.tsx";
import Runbooks from "./pages/Runbooks.tsx";
enum Section {
Home,
History,
Dotfiles,
Runbooks,
}
function renderMain(section: Section): ReactElement {
@ -38,6 +43,8 @@ function renderMain(section: Section): ReactElement {
return <History />;
case Section.Dotfiles:
return <Dotfiles />;
case Section.Runbooks:
return <Runbooks />;
}
}
@ -65,6 +72,11 @@ function App() {
icon: WrenchScrewdriverIcon,
section: Section.Dotfiles,
},
{
name: "Runbooks",
icon: ChevronRightSquare,
section: Section.Runbooks,
},
];
return (

View File

@ -0,0 +1,91 @@
import "@blocknote/core/fonts/inter.css";
import "@blocknote/mantine/style.css";
import "./index.css";
import {
BlockNoteSchema,
defaultBlockSpecs,
filterSuggestionItems,
insertOrUpdateBlock,
} from "@blocknote/core";
import "@blocknote/core/fonts/inter.css";
import {
SuggestionMenuController,
AddBlockButton,
getDefaultReactSlashMenuItems,
useCreateBlockNote,
SideMenu,
SideMenuController,
} from "@blocknote/react";
import { BlockNoteView } from "@blocknote/mantine";
import { Code } from "lucide-react";
import RunBlock from "@/components/runbooks/editor/blocks/RunBlock";
import { DeleteBlock } from "@/components/runbooks/editor/ui/DeleteBlockButton";
// Our schema with block specs, which contain the configs and implementations for blocks
// that we want our editor to use.
const schema = BlockNoteSchema.create({
blockSpecs: {
// Adds all default blocks.
...defaultBlockSpecs,
// Adds the code block.
run: RunBlock,
},
});
// Slash menu item to insert an Alert block
const insertRun = (editor: typeof schema.BlockNoteEditor) => ({
title: "Code block",
onItemClick: () => {
insertOrUpdateBlock(editor, {
type: "run",
});
},
icon: <Code size={18} />,
aliases: ["code", "run"],
group: "Code",
});
export default function Editor() {
// Creates a new editor instance.
const editor = useCreateBlockNote({
schema,
initialContent: [
{
type: "heading",
content: "Atuin runbooks",
id: "foo",
},
],
});
// Renders the editor instance.
return (
<div>
<BlockNoteView editor={editor} slashMenu={false} sideMenu={false}>
<SuggestionMenuController
triggerCharacter={"/"}
getItems={async (query) =>
filterSuggestionItems(
[...getDefaultReactSlashMenuItems(editor), insertRun(editor)],
query,
)
}
/>
<SideMenuController
sideMenu={(props) => (
<SideMenu {...props}>
<AddBlockButton {...props} />
<DeleteBlock {...props} />
</SideMenu>
)}
/>
</BlockNoteView>
</div>
);
}

View File

@ -0,0 +1,158 @@
// Based on the basicSetup extension, as suggested by the source. Customized for Atuin.
import {
KeyBinding,
lineNumbers,
highlightActiveLineGutter,
highlightSpecialChars,
drawSelection,
dropCursor,
rectangularSelection,
crosshairCursor,
highlightActiveLine,
keymap,
} from "@codemirror/view";
import { EditorState, Extension } from "@codemirror/state";
import { history, defaultKeymap, historyKeymap } from "@codemirror/commands";
import { highlightSelectionMatches, searchKeymap } from "@codemirror/search";
import {
closeBrackets,
autocompletion,
closeBracketsKeymap,
completionKeymap,
CompletionContext,
} from "@codemirror/autocomplete";
import {
foldGutter,
indentOnInput,
syntaxHighlighting,
defaultHighlightStyle,
bracketMatching,
indentUnit,
foldKeymap,
} from "@codemirror/language";
import { lintKeymap } from "@codemirror/lint";
import { invoke } from "@tauri-apps/api/core";
export interface MinimalSetupOptions {
highlightSpecialChars?: boolean;
history?: boolean;
drawSelection?: boolean;
syntaxHighlighting?: boolean;
defaultKeymap?: boolean;
historyKeymap?: boolean;
}
export interface BasicSetupOptions extends MinimalSetupOptions {
lineNumbers?: boolean;
highlightActiveLineGutter?: boolean;
foldGutter?: boolean;
dropCursor?: boolean;
allowMultipleSelections?: boolean;
indentOnInput?: boolean;
bracketMatching?: boolean;
closeBrackets?: boolean;
autocompletion?: boolean;
rectangularSelection?: boolean;
crosshairCursor?: boolean;
highlightActiveLine?: boolean;
highlightSelectionMatches?: boolean;
closeBracketsKeymap?: boolean;
searchKeymap?: boolean;
foldKeymap?: boolean;
completionKeymap?: boolean;
lintKeymap?: boolean;
tabSize?: number;
}
function myCompletions(context: CompletionContext) {
let word = context.matchBefore(/^.*/);
if (!word) return null;
if (word.from == word.to && !context.explicit) return null;
return invoke("prefix_search", { query: word.text }).then(
// @ts-ignore
(results: string[]) => {
let options = results.map((i) => {
return { label: i, type: "text" };
});
return {
from: word.from,
options,
};
},
);
}
const buildAutocomplete = (): Extension => {
let ac = autocompletion({ override: [myCompletions] });
return ac;
};
export const extensions = (options: BasicSetupOptions = {}): Extension[] => {
const { crosshairCursor: initCrosshairCursor = false } = options;
let keymaps: KeyBinding[] = [];
if (options.closeBracketsKeymap !== false) {
keymaps = keymaps.concat(closeBracketsKeymap);
}
if (options.defaultKeymap !== false) {
keymaps = keymaps.concat(defaultKeymap);
}
if (options.searchKeymap !== false) {
keymaps = keymaps.concat(searchKeymap);
}
if (options.historyKeymap !== false) {
keymaps = keymaps.concat(historyKeymap);
}
if (options.foldKeymap !== false) {
keymaps = keymaps.concat(foldKeymap);
}
if (options.completionKeymap !== false) {
keymaps = keymaps.concat(completionKeymap);
}
if (options.lintKeymap !== false) {
keymaps = keymaps.concat(lintKeymap);
}
const extensions: Extension[] = [];
if (options.lineNumbers !== false) extensions.push(lineNumbers());
if (options.highlightActiveLineGutter !== false)
extensions.push(highlightActiveLineGutter());
if (options.highlightSpecialChars !== false)
extensions.push(highlightSpecialChars());
if (options.history !== false) extensions.push(history());
if (options.foldGutter !== false) extensions.push(foldGutter());
if (options.drawSelection !== false) extensions.push(drawSelection());
if (options.dropCursor !== false) extensions.push(dropCursor());
if (options.allowMultipleSelections !== false)
extensions.push(EditorState.allowMultipleSelections.of(true));
if (options.indentOnInput !== false) extensions.push(indentOnInput());
if (options.syntaxHighlighting !== false)
extensions.push(
syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
);
if (options.bracketMatching !== false) extensions.push(bracketMatching());
if (options.closeBrackets !== false) extensions.push(closeBrackets());
if (options.autocompletion !== false) extensions.push(buildAutocomplete());
if (options.rectangularSelection !== false)
extensions.push(rectangularSelection());
if (initCrosshairCursor !== false) extensions.push(crosshairCursor());
if (options.highlightActiveLine !== false)
extensions.push(highlightActiveLine());
if (options.highlightSelectionMatches !== false)
extensions.push(highlightSelectionMatches());
if (options.tabSize && typeof options.tabSize === "number")
extensions.push(indentUnit.of(" ".repeat(options.tabSize)));
return extensions.concat([keymap.of(keymaps.flat())]).filter(Boolean);
};

View File

@ -0,0 +1,9 @@
ProseMirror-focused {
outline: none !important;
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1) !important;
}
.cm-editor.cm-focused {
outline: none !important;
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1) !important;
}

View File

@ -0,0 +1,146 @@
import { createReactBlockSpec } from "@blocknote/react";
import "./index.css";
import CodeMirror from "@uiw/react-codemirror";
import { langs } from "@uiw/codemirror-extensions-langs";
import { Play, Square } from "lucide-react";
import { useState } from "react";
import { extensions } from "./extensions";
import { invoke } from "@tauri-apps/api/core";
import Terminal from "./terminal.tsx";
import "@xterm/xterm/css/xterm.css";
interface RunBlockProps {
onChange: (val: string) => void;
onPlay?: () => void;
onStop?: () => void;
id: string;
code: string;
type: string;
isEditable: boolean;
}
const RunBlock = ({ onPlay, id, code, isEditable }: RunBlockProps) => {
const [isRunning, setIsRunning] = useState(false);
const [showTerminal, setShowTerminal] = useState(false);
const [value, setValue] = useState<String>(code);
const [pty, setPty] = useState<string | null>(null);
const onChange = (val: any) => {
setValue(val);
};
const handleToggle = async (event: any) => {
event.stopPropagation();
// If there's no code, don't do anything
if (!value) return;
setIsRunning(!isRunning);
setShowTerminal(!isRunning);
if (isRunning) {
// send sigkill
console.log("sending sigkill");
await invoke("pty_kill", { pid: pty });
}
if (!isRunning) {
if (onPlay) onPlay();
let pty = await invoke<string>("pty_open");
setPty(pty);
console.log(pty);
let val = !value.endsWith("\n") ? value + "\n" : value;
await invoke("pty_write", { pid: pty, data: val });
}
};
return (
<div className="w-full !outline-none">
<div className="flex items-start">
<button
onClick={handleToggle}
className={`flex items-center justify-center flex-shrink-0 w-8 h-8 mr-2 rounded border focus:outline-none focus:ring-2 transition-all duration-300 ease-in-out ${
isRunning
? "border-red-200 bg-red-50 text-red-600 hover:bg-red-100 hover:border-red-300 focus:ring-red-300"
: "border-green-200 bg-green-50 text-green-600 hover:bg-green-100 hover:border-green-300 focus:ring-green-300"
}`}
aria-label={isRunning ? "Stop code" : "Run code"}
>
<span
className={`inline-block transition-transform duration-300 ease-in-out ${isRunning ? "rotate-180" : ""}`}
>
{isRunning ? <Square size={16} /> : <Play size={16} />}
</span>
</button>
<div className="flex-grow">
<CodeMirror
id={id}
placeholder={"Write your code here..."}
className="!pt-0 border border-gray-300 rounded"
value={code}
editable={isEditable}
width="100%"
autoFocus
onChange={onChange}
extensions={[...extensions(), langs.shell()]}
basicSetup={false}
/>
<div
className={`overflow-hidden transition-all duration-300 ease-in-out ${
showTerminal ? "block" : "hidden"
}`}
>
{pty && <Terminal pty={pty} />}
</div>
</div>
</div>
</div>
);
};
export default createReactBlockSpec(
{
type: "run",
propSchema: {
type: {
default: "bash",
},
code: { default: "" },
},
content: "none",
},
{
// @ts-ignore
render: ({ block, editor, code, type }) => {
const onInputChange = (val: string) => {
editor.updateBlock(block, {
props: { ...block.props, code: val },
});
};
return (
<RunBlock
onChange={onInputChange}
id={block?.id}
code={code}
type={type}
isEditable={editor.isEditable}
/>
);
},
toExternalHTML: ({ block }) => {
return (
<pre lang="beep boop">
<code lang="bash">{block?.props?.code}</code>
</pre>
);
},
},
);

View File

@ -0,0 +1,82 @@
/*
export const openTerm = (pty: string, id: string) => {
const term = new Terminal({
fontSize: 12,
fontFamily: "Courier New",
});
let element = document.getElementById(id);
term.open(element);
//term.onResize(onResize(pty));
//const fitAddon = new FitAddon();
//term.loadAddon(fitAddon);
//term.loadAddon(new WebglAddon());
/*
const onSize = (e) => {
e.stopPropagation();
fitAddon.fit();
};
fitAddon.fit();
window.addEventListener("resize", onSize, false);
*/
import { useEffect, useRef } from "react";
import { Terminal } from "@xterm/xterm";
import { listen } from "@tauri-apps/api/event";
import { FitAddon } from "@xterm/addon-fit";
import { WebglAddon } from "@xterm/addon-webgl";
import "@xterm/xterm/css/xterm.css";
import { invoke } from "@tauri-apps/api/core";
const onResize = (pty: string) => async (size: any) => {
await invoke("pty_resize", {
pid: pty,
cols: size.cols,
rows: size.rows,
});
};
const TerminalComponent = ({ pty }: any) => {
const terminalRef = useRef(null);
useEffect(() => {
if (pty == null) return;
if (!terminalRef.current) return;
const terminal = new Terminal();
const fitAddon = new FitAddon();
terminal.open(terminalRef.current);
terminal.loadAddon(new WebglAddon());
terminal.loadAddon(fitAddon);
terminal.onResize(onResize(pty));
const windowResize = () => {
fitAddon.fit();
};
listen(`pty-${pty}`, (event: any) => {
terminal.write(event.payload);
}).then(() => {
console.log("Listening for pty events");
});
window.addEventListener("resize", windowResize);
fitAddon.fit();
// Customize further as needed
return () => {
terminal.dispose();
window.removeEventListener("resize", windowResize);
};
}, [pty]);
return <div ref={terminalRef} />;
};
export default TerminalComponent;

View File

@ -0,0 +1,7 @@
.editor a {
color: #0000ee;
}
.editor a:hover {
cursor: pointer;
}

View File

@ -0,0 +1,28 @@
import {
SideMenuProps,
useBlockNoteEditor,
useComponentsContext,
} from "@blocknote/react";
import { TrashIcon } from "lucide-react";
// Custom Side Menu button to remove the hovered block.
export function DeleteBlock(props: SideMenuProps) {
const editor = useBlockNoteEditor();
const Components = useComponentsContext()!;
return (
<Components.SideMenu.Button
label="Remove block"
className="mx-1"
icon={
<TrashIcon
size={24}
onClick={() => {
editor.removeBlocks([props.block]);
}}
/>
}
/>
);
}

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from "react";
import React, { useEffect } from "react";
import { formatRelative } from "date-fns";
import { Tooltip as ReactTooltip } from "react-tooltip";
@ -41,16 +41,24 @@ function Header({ name }: any) {
{greeting}
</h2>
<h3 className="text-xl leading-7 text-gray-900 pt-4">
Welcome to Atuin.
Welcome to{" "}
<a
href="https://atuin.sh"
target="_blank"
rel="noopener noreferrer nofollow"
>
Atuin
</a>
.
</h3>
</div>
</div>
);
}
const explicitTheme: ThemeInput = {
const explicitTheme = {
light: ["#f0f0f0", "#c4edde", "#7ac7c4", "#f73859", "#384259"],
dark: ["#383838", "#4D455D", "#7DB9B6", "#F5E9CF", "#E96479"],
dark: ["#f0f0f0", "#c4edde", "#7ac7c4", "#f73859", "#384259"],
};
export default function Home() {
@ -147,7 +155,7 @@ export default function Home() {
<ActivityCalendar
theme={explicitTheme}
data={calendar}
weekStart={weekStart}
weekStart={weekStart as any}
renderBlock={(block, activity) =>
React.cloneElement(block, {
"data-tooltip-id": "react-tooltip",

View File

@ -0,0 +1,9 @@
import Editor from "@/components/runbooks/editor/Editor";
export default function Runbooks() {
return (
<div className="pl-60 p-4 ">
<Editor />
</div>
);
}

View File

@ -1,5 +1,5 @@
import { create } from "zustand";
import { persist, createJSONStorage } from "zustand/middleware";
import { persist } from "zustand/middleware";
import { parseISO } from "date-fns";
@ -39,13 +39,15 @@ interface AtuinState {
historyNextPage: (query?: string) => void;
}
let state = (set, get): AtuinState => ({
let state = (set: any, get: any): AtuinState => ({
user: DefaultUser,
homeInfo: DefaultHomeInfo,
aliases: [],
vars: [],
shellHistory: [],
calendar: [],
// @ts-ignore
weekStart: new Intl.Locale(navigator.language).getWeekInfo().firstDay,
refreshAliases: () => {