109 lines
3.3 KiB
Nix
109 lines
3.3 KiB
Nix
{
|
|
pkgs,
|
|
config,
|
|
lib,
|
|
...
|
|
}:
|
|
with lib; let
|
|
cfg = config.programs.aichat;
|
|
yamlFormat = pkgs.formats.yaml {};
|
|
fishIntegration = ''
|
|
function _aichat_fish
|
|
set -l _old (commandline)
|
|
if test -n $_old
|
|
echo -n "⌛"
|
|
commandline -f repaint
|
|
commandline (aichat -e $_old)
|
|
end
|
|
end
|
|
bind \co _aichat_fish'';
|
|
nuIntegration = ''
|
|
def _aichat_nushell [] {
|
|
let _prev = (commandline)
|
|
if ($_prev != "") {
|
|
print '⌛'
|
|
commandline edit -r (aichat -e $_prev)
|
|
}
|
|
}
|
|
|
|
$env.config.keybindings = ($env.config.keybindings | append {
|
|
name: aichat_integration
|
|
modifier: control
|
|
keycode: char_g
|
|
mode: [emacs, vi_insert]
|
|
event:[
|
|
{
|
|
send: executehostcommand,
|
|
cmd: "_aichat_nushell"
|
|
}
|
|
]
|
|
}
|
|
)
|
|
'';
|
|
bashIntegration = ''
|
|
_aichat_bash() {
|
|
if [[ -n "$READLINE_LINE" ]]; then
|
|
READLINE_LINE=$(aichat -e "$READLINE_LINE")
|
|
READLINE_POINT=''${#READLINE_LINE}
|
|
fi
|
|
}
|
|
bind -x '"\co": _aichat_bash'
|
|
'';
|
|
zshIntegration = ''
|
|
_aichat_zsh() {
|
|
if [[ -n "$BUFFER" ]]; then
|
|
local _old=$BUFFER
|
|
BUFFER+="⌛"
|
|
zle -I && zle redisplay
|
|
BUFFER=$(aichat -e "$_old")
|
|
zle end-of-line
|
|
fi
|
|
}
|
|
zle -N _aichat_zsh
|
|
bindkey '\co' _aichat_zsh
|
|
'';
|
|
in {
|
|
options = {
|
|
programs.aichat = {
|
|
enable = mkEnableOption "aichat";
|
|
package = mkPackageOption pkgs "aichat" {};
|
|
|
|
enableFishIntegration = mkEnableOption "Fish integration" // {default = true;};
|
|
enableBashIntegration = mkEnableOption "Bash integration" // {default = true;};
|
|
enableZshIntegration = mkEnableOption "Zsh integration" // {default = true;};
|
|
enableNushellIntegration = mkEnableOption "Nushell integration" // {default = true;};
|
|
|
|
settings = lib.mkOption {
|
|
type = yamlFormat.type;
|
|
description = "Options";
|
|
};
|
|
};
|
|
};
|
|
|
|
config = let
|
|
api_key_files = concatStringsSep " " (builtins.map (client: ''--run "export ${lib.toUpper client.name}_API_KEY=\`cat -v ${client.api_key_file}\`"'') (builtins.filter (client: (builtins.hasAttr "api_key_file" client)) cfg.settings.clients));
|
|
api_key_cmds = concatStringsSep " " (builtins.map (client: ''--run "export ${lib.toUpper client.name}_API_KEY=\`${client.api_key_cmd}\`"'') (builtins.filter (client: (builtins.hasAttr "api_key_cmd" client)) cfg.settings.clients));
|
|
|
|
aichat-wrapped = pkgs.symlinkJoin {
|
|
name = "aichat";
|
|
paths = [
|
|
cfg.package
|
|
];
|
|
buildInputs = [pkgs.makeWrapper];
|
|
postBuild = ''
|
|
wrapProgram $out/bin/aichat ${api_key_files} ${api_key_cmds}
|
|
'';
|
|
};
|
|
in {
|
|
home.packages = mkIf cfg.enable [aichat-wrapped];
|
|
|
|
programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration fishIntegration;
|
|
programs.bash.initExtra = mkIf cfg.enableBashIntegration bashIntegration;
|
|
programs.zsh.initExtra = mkIf cfg.enableZshIntegration zshIntegration;
|
|
programs.nushell.extraConfig = mkIf cfg.enableNushellIntegration nuIntegration;
|
|
|
|
xdg.configFile."aichat/config.yaml".source =
|
|
yamlFormat.generate "config.yaml" cfg.settings;
|
|
};
|
|
}
|