Compare commits

...

15 commits

Author SHA1 Message Date
79c98d1e5d
Add many gptel tools
All checks were successful
BUILD x86_64-linux.picard
UPLOAD x86_64-linux.picard
DOWNLOAD x86_64-linux.picard
CACHIX x86_64-linux.picard
ATTIC x86_64-linux.picard
EVAL x86_64-linux.picard
/ test (push) Successful in -8s
2025-05-16 16:08:15 +02:00
36ad3ced81
Indentation 2025-05-16 16:07:48 +02:00
fffef90905
Enable typst-ts-mode 2025-05-16 16:07:27 +02:00
1ed4ed0da5
Indentation 2025-05-16 16:07:12 +02:00
f55a6b6423
Play with tidal (tidal cycles) 2025-05-16 16:06:20 +02:00
a7c19c03df
haskell-language-server-wrapper -> haskell-language-server 2025-05-16 16:05:49 +02:00
cdfa60ad5e
Add arbi NixOS module 2025-05-16 16:05:12 +02:00
39b276d691
Remove OS icon from prompt 2025-05-16 16:03:13 +02:00
cc3a0012b5
services.gpg-agent.pinentryPackage option renamed 2025-05-16 16:02:43 +02:00
995af14515
Disable spotify at startup 2025-05-16 16:02:32 +02:00
58cfa8ee1f
Use amule module from my PR 2025-05-16 16:02:18 +02:00
8fcc7106c3
Update garmin-grafana 2025-05-16 16:00:57 +02:00
f2da144a92
Add typst-ts-mode to emacs 2025-05-16 16:00:37 +02:00
40b8028383
Add tidal package to emacs 2025-05-16 16:00:30 +02:00
bf464f6e34
dump1090 NixOS module 2025-05-16 16:00:03 +02:00
11 changed files with 349 additions and 116 deletions

View file

@ -566,7 +566,10 @@
:mode "\\.hs\\'" :mode "\\.hs\\'"
:config :config
(add-to-list 'eglot-server-programs (add-to-list 'eglot-server-programs
'(haskell-ts-mode . ("haskell-language-server-wrapper" "--lsp")))) '(haskell-ts-mode . ("haskell-language-server" "--lsp"))))
(use-package tidal
:custom ((tidal-interpreter "tidal")))
(use-package purescript-mode (use-package purescript-mode
:custom ((project-vc-extra-root-markers '("spago.dhall"))) :custom ((project-vc-extra-root-markers '("spago.dhall")))
@ -596,6 +599,15 @@
(use-package gptscript-mode (use-package gptscript-mode
:mode "\\.gpt\\'") :mode "\\.gpt\\'")
(use-package gptscript-mode
:mode "\\.gpt\\'")
(use-package typst-ts-mode
:config
(add-to-list 'eglot-server-programs
'(typst-ts-mode . ("tinymist" "lsp")))
:mode "\\.typ\\'")
;; FIXME ;; FIXME
;; (use-package mmm-mode ;; (use-package mmm-mode
;; :config ;; :config
@ -1027,7 +1039,7 @@ This is meant to be an helper to be called from the window manager."
) )
(gptel-default-mode 'org-mode) (gptel-default-mode 'org-mode)
(gptel-org-branching-context nil) ;; this is cool but I don't feel comfortable with it (gptel-org-branching-context nil) ;; this is cool but I don't feel comfortable with it
(gptel-use-tools nil) (gptel-use-tools 't)
:bind :bind
("C-c a a" . gptel-add) ("C-c a a" . gptel-add)
@ -1042,56 +1054,139 @@ This is meant to be an helper to be called from the window manager."
;; (add-hook 'gptel-post-response-functions 'gptel-end-of-response) ;; (add-hook 'gptel-post-response-functions 'gptel-end-of-response)
;; (add-hook 'gptel-post-stream-hook 'gptel-auto-scroll) ;; (add-hook 'gptel-post-stream-hook 'gptel-auto-scroll)
(setq gptel-tools (mapcar (lambda (tool) (apply #'gptel-make-tool tool)) (defun ccr/edit-buffer (buffer-name old-string new-string)
'(( "In BUFFER-NAME, replace OLD-STRING with NEW-STRING."
:name "create_file" (with-current-buffer buffer-name
:function (lambda (path filename content) (let ((case-fold-search nil)) ;; Case-sensitive search
(let ((full-path (expand-file-name filename path))) (save-excursion
(with-temp-buffer (goto-char (point-min))
(let ((count 0))
(while (search-forward old-string nil t)
(setq count (1+ count)))
(if (= count 0)
(format "Error: Could not find text to replace in buffer %s" buffer-name)
(if (> count 1)
(format "Error: Found %d matches for the text to replace in buffer %s" count buffer-name)
(goto-char (point-min))
(search-forward old-string)
(replace-match new-string t t)
(format "Successfully edited buffer %s" buffer-name))))))))
(defun ccr/replace-buffer (buffer-name content)
"Completely replace contents of BUFFER-NAME with CONTENT."
(with-current-buffer buffer-name
(erase-buffer)
(insert content) (insert content)
(write-file full-path)) (format "Buffer replaced: %s" buffer-name)))
(format-read "Created file %s in %s" filename path)))
:description "Create a new file with the specified content" (setq gptel-tools `(
:args (list '(:name "path" ,(gptel-make-tool
:function (lambda (url)
(with-current-buffer (url-retrieve-synchronously url)
(goto-char (point-min))
(forward-paragraph)
(let ((dom (libxml-parse-html-region (point) (point-max))))
(run-at-time 0 nil #'kill-buffer (current-buffer))
(with-temp-buffer
(shr-insert-document dom)
(buffer-substring-no-properties (point-min) (point-max))))))
:name "read_url"
:description "Fetch and read the contents of a URL"
:args (list '(:name "url"
:type string :type string
:description "The directory where to create the file") :description "The URL to read"))
'(:name "filename" :category "web")
,(gptel-make-tool
:function (lambda (filepath)
(with-temp-buffer
(insert-file-contents (expand-file-name filepath))
(buffer-string)))
:name "read_file"
:description "Read and display the contents of a file"
:args (list '(:name "filepath"
:type string :type string
:description "The name of the file to create") :description "Path to the file to read. Supports relative paths and ~."))
'(:name "content" :category "filesystem")
,(gptel-make-tool
:function (lambda (directory)
(mapconcat #'identity
(directory-files directory)
"\n"))
:name "list_directory"
:description "List the contents of a given directory"
:args (list '(:name "directory"
:type string :type string
:description "The content to write to the file")) :description "The path to the directory to list"))
:category "filesystem" :category "filesystem")
) ,(gptel-make-tool
;; ( :function (lambda () (mapcar 'buffer-name (buffer-list)))
;; :name "run_command" :name "list_buffers"
;; :confirm 't :description "Return a list containing all the Emacs buffers"
;; :function (lambda (command) :category "emacs")
;; (shell-command-to-string command)) ,(gptel-make-tool
;; :description "Run arbitrary commands" :function (lambda (buffer)
;; :args (list '(:name "command" (unless (buffer-live-p (get-buffer buffer))
;; :type string (error "Error: buffer %s is not live." buffer))
;; :description "The content to run e.g. 'ls *' or 'fd <pattern> <path>'")) (with-current-buffer buffer
;; ) (buffer-substring-no-properties (point-min) (point-max))))
( :name "read_buffer"
:name "get_weather" :description "Return the contents of an Emacs buffer"
:function (lambda (location) :args (list '(:name "buffer"
(url-retrieve-synchronously "api.weather.com/..."
location unit))
:description "Get the current weather in a given location"
:args (list '(:name "location"
:type string :type string
:description "The city and state, e.g. San Francisco, CA") :description "The name of the buffer whose contents are to be retrieved"))
'(:name "unit" :category "emacs")
,(gptel-make-tool
:function (lambda (buffer text)
(with-current-buffer (get-buffer-create buffer)
(save-excursion
(goto-char (point-max))
(insert text)))
(format "Appended text to buffer %s" buffer))
:name "append_to_buffer"
:description "Append text to an Emacs buffer. If the buffer does not exist, it will be created."
:confirm t
:args (list '(:name "buffer"
:type string :type string
:enum ["celsius" "farenheit"] :description "The name of the buffer to append text to.")
:description '(:name "text"
"The unit of temperature, either 'celsius' or 'fahrenheit" :type string
:optional t :description "The text to append to the buffer."))
:category "emacs")
,(gptel-make-tool
:name "EditBuffer"
:function #'ccr/edit-buffer
:description "Edits Emacs buffers"
:confirm t
:args '((:name "buffer_name"
:type string
:description "Name of the buffer to modify"
:required t)
(:name "old_string"
:type string
:description "Text to replace (must match exactly)"
:required t)
(:name "new_string"
:type string
:description "Text to replace old_string with"
:required t))
:category "edit")
,
(gptel-make-tool
:name "ReplaceBuffer"
:function #'ccr/replace-buffer
:description "Completely overwrites buffer contents"
:confirm t
:args '((:name "buffer_name"
:type string
:description "Name of the buffer to overwrite"
:required t)
(:name "content"
:type string
:description "Content to write to the buffer"
:required t))
:category "edit")
)) ))
)
))
)
(defun ccr/suggest-eshell-command () (defun ccr/suggest-eshell-command ()
(interactive) (interactive)

View file

@ -2,7 +2,7 @@
{ {
services.gpg-agent = { services.gpg-agent = {
enable = true; enable = true;
pinentryPackage = pkgs.pinentry-rofi.override { pinentry.package = pkgs.pinentry-rofi.override {
rofi = pkgs.rofi-wayland; rofi = pkgs.rofi-wayland;
}; };
extraConfig = '' extraConfig = ''

View file

@ -0,0 +1,61 @@
{
"$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
"palette": {
"os": "#ACB0BE",
"closer": "p:os",
"pink": "#F5C2E7",
"lavender": "#B4BEFE",
"blue": "#89B4FA"
},
"blocks": [
{
"alignment": "left",
"segments": [
{
"foreground": "p:blue",
"style": "plain",
"template": "{{ .UserName }}@{{ .HostName }} ",
"type": "session"
},
{
"foreground": "p:pink",
"properties": {
"folder_icon": "..\ue5fe..",
"home_icon": "~",
"style": "agnoster_short"
},
"style": "plain",
"template": "{{ .Path }} ",
"type": "path"
},
{
"foreground": "p:lavender",
"properties": {
"branch_icon": "\ue725 ",
"cherry_pick_icon": "\ue29b ",
"commit_icon": "\uf417 ",
"fetch_status": false,
"fetch_upstream_icon": false,
"merge_icon": "\ue727 ",
"no_commits_icon": "\uf0c3 ",
"rebase_icon": "\ue728 ",
"revert_icon": "\uf0e2 ",
"tag_icon": "\uf412 "
},
"template": "{{ .HEAD }} ",
"style": "plain",
"type": "git"
},
{
"style": "plain",
"foreground": "p:closer",
"template": "\uf105",
"type": "text"
}
],
"type": "prompt"
}
],
"final_space": true,
"version": 3
}

View file

@ -84,7 +84,12 @@
programs.thefuck.enable = true; programs.thefuck.enable = true;
programs.oh-my-posh = { programs.oh-my-posh = {
enable = true; enable = true;
useTheme = "catppuccin_mocha"; # same as "captuccin_mocha" but without the OS logo
settings = lib.mkForce (
builtins.fromJSON (
builtins.unsafeDiscardStringContext (builtins.readFile ./catppuccin_mocha.omp.json)
)
);
}; };
programs.zellij.enableBashIntegration = false; programs.zellij.enableBashIntegration = false;

View file

@ -9,18 +9,18 @@ in
{ {
home.packages = [ spotify-adblocked ]; home.packages = [ spotify-adblocked ];
systemd.user.services.spotify-adblocked = { # systemd.user.services.spotify-adblocked = {
Install.WantedBy = [ "graphical-session.target" ]; # Install.WantedBy = [ "graphical-session.target" ];
Unit = { # Unit = {
Description = "Spotify"; # Description = "Spotify";
PartOf = [ "graphical-session.target" ]; # PartOf = [ "graphical-session.target" ];
}; # };
Service = { # Service = {
ExecStart = lib.getExe spotify-adblocked; # ExecStart = lib.getExe spotify-adblocked;
Restart = "on-failure"; # Restart = "on-failure";
RestartSec = 3; # RestartSec = 3;
}; # };
}; # };
} }

View file

@ -36,6 +36,8 @@
"amule" "amule"
"adguard-home" "adguard-home"
"garmin-grafana" "garmin-grafana"
# "dump1090"
"arbi"
] ]
++ [ ++ [
./disko.nix ./disko.nix

View file

@ -1,34 +1,46 @@
{ config, lib, ... }: { config, pkgs, ... }:
let
rev = "966199fe1dccc9c6c7016bdb1d9582f27797bc02";
amule-flake = builtins.getFlake "github:NixOS/nixpkgs/${rev}";
inherit (amule-flake.legacyPackages.${pkgs.system}) amule-daemon amule-web;
in
{ {
users.users.amule = { disabledModules = [ "services/networking/amuled.nix" ];
isSystemUser = true; documentation.nixos.enable = false;
group = "amule";
extraGroups = [ "amule" ]; imports = [ "${amule-flake}/nixos/modules/services/networking/amuled.nix" ];
home = config.services.amule.dataDir;
};
users.groups.amule = { };
services.amule = { services.amule = {
dataDir = "/mnt/hd/amule";
enable = true; enable = true;
user = "amule"; package = amule-daemon;
amuleWebPackage = amule-web;
openPeerPorts = true;
openWebServerPort = true;
# TODO the service is accessible only from the VPN
# however better using agenix
ExternalConnectPasswordFile = pkgs.writeText "password" "pippo";
WebServerPasswordFile = pkgs.writeText "password" "pippo";
settings = {
eMule = {
IncomingDir = "/mnt/hd/amule";
TempDir = "/mnt/hd/amule/Temp";
};
WebServer = {
Enabled = 1;
};
};
}; };
# sometimes the service crashes with a segfeault without any reason...
systemd.services.amuled.serviceConfig.Restart = lib.mkForce "always";
environment.persistence."/persist".directories = [ environment.persistence."/persist".directories = [
config.services.amule.dataDir config.services.amule.dataDir
]; ];
networking.firewall = { services.nginx.virtualHosts."amule.sisko.wg.aciceri.dev" = {
allowedTCPPorts = [ 4662 ]; forceSSL = true;
allowedUDPPortRanges = [ useACMEHost = "aciceri.dev";
{ locations."/" = {
from = 4665; proxyPass = "http://localhost:${builtins.toString config.services.amule.settings.WebServer.Port}";
to = 4672; };
} serverAliases = [ "amule.sisko.zt.aciceri.dev" ];
];
}; };
} }

22
modules/arbi/default.nix Normal file
View file

@ -0,0 +1,22 @@
{ config, pkgs, ... }:
let
rev = "d531730d9640160f0519ef4b3640f8da49dd96f8";
arbi-flake = builtins.getFlake "git+ssh://git@github.com/aciceri/arbi.git?rev=${rev}";
in
{
imports = [ arbi-flake.nixosModules.arbi ];
services.arbi = {
enable = true;
log_level = "debug";
configFile = pkgs.writeText "arbi-config.kdl" ''
endpoint "wss://eth-mainnet.g.alchemy.com/v2/<REDACTED>"
pairs_file "pairs.json"
concurrency 4
'';
};
environment.persistence."/persist".directories = [
config.services.arbi.dataDir
];
}

View file

@ -0,0 +1,31 @@
{
pkgs,
...
}:
let
dump1090-flake = builtins.getFlake "github:NixOS/nixpkgs/541f05042033467730fb8cedb08355dc91b94c74";
inherit (dump1090-flake.legacyPackages.${pkgs.system}) dump1090-fa;
in
{
imports = [ "${dump1090-flake}/nixos/modules/services/misc/dump1090-fa.nix" ];
hardware.rtl-sdr.enable = true;
disabledModules = [ "services/misc/dump10190-fa.nix" ];
documentation.nixos.enable = false;
services.dump1090-fa = {
enable = true;
package = dump1090-fa;
};
services.nginx.virtualHosts."dump1090.sisko.wg.aciceri.dev" = {
forceSSL = true;
useACMEHost = "aciceri.dev";
locations = {
"/".alias = "${dump1090-fa}/share/dump1090/";
"/data/".alias = "/run/dump1090-fa/";
};
serverAliases = [ "dump1090.sisko.zt.aciceri.dev" ];
};
}

View file

@ -5,7 +5,8 @@
... ...
}: }:
let let
garmin-grafana-flake = builtins.getFlake "github:NixOS/nixpkgs/1f03fefb44665cd2377912033de22ffaba2be48d"; rev = "f24579d13ee035af96d4a68b765af2aa4b1018b6";
garmin-grafana-flake = builtins.getFlake "github:NixOS/nixpkgs/${rev}";
inherit (garmin-grafana-flake.legacyPackages.${pkgs.system}) garmin-grafana; inherit (garmin-grafana-flake.legacyPackages.${pkgs.system}) garmin-grafana;
in in
{ {

View file

@ -206,6 +206,7 @@ let
mixed-pitch mixed-pitch
visual-replace visual-replace
org-super-agenda org-super-agenda
tidal
# org-re-reveal # FIXME very not nice hash mismatch when building # org-re-reveal # FIXME very not nice hash mismatch when building
] ]
) )
@ -222,6 +223,9 @@ let
eat eat
corfu-terminal corfu-terminal
haskell-ts-mode haskell-ts-mode
])
++ (with epkgs; [
typst-ts-mode # why this doesn't seem to be in elpaPackages?
]); ]);
in in
mainPackages ++ (builtins.attrValues extraPackages) mainPackages ++ (builtins.attrValues extraPackages)