mirror of
https://github.com/mark3labs/kit.git
synced 2026-06-13 19:20:06 +00:00
685aaf207f
- Add fsnotify-based file watcher that auto-reloads extensions on .go file changes in autoloaded dirs with 300ms debounce - Add /reload-ext built-in command (alias /re) for manual reload - Add Agent.SetExtraTools() so extension tools update on reload instead of being baked in at agent creation time - Run reload async via tea.Cmd to avoid prog.Send() deadlock when extension handlers call ctx.Print() during SessionStart/Shutdown - Wire watcher lifecycle into cmd/root.go with graceful shutdown
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
//go:build ignore
|
|
|
|
// dev-reload.go — Extension Hot-Reload example extension for Kit.
|
|
//
|
|
// Demonstrates ctx.ReloadExtensions() which hot-reloads all extensions
|
|
// from disk without restarting Kit. This is invaluable during extension
|
|
// development: edit your extension source, then type /reload to pick up
|
|
// changes immediately.
|
|
//
|
|
// Note: Extensions in autoloaded directories (~/.config/kit/extensions/
|
|
// and .kit/extensions/) are automatically reloaded on save. The /reload
|
|
// command is useful for extensions loaded via -e from other locations.
|
|
//
|
|
// Event handlers, slash commands, tool definitions, tool renderers,
|
|
// message renderers, and keyboard shortcuts all update immediately.
|
|
//
|
|
// Commands:
|
|
// /reload — hot-reload all extensions from disk
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
ext "kit/ext"
|
|
)
|
|
|
|
var loadedAt string
|
|
|
|
func Init(api ext.API) {
|
|
loadedAt = time.Now().Format("15:04:05")
|
|
|
|
api.RegisterCommand(ext.CommandDef{
|
|
Name: "reload",
|
|
Description: "Hot-reload all extensions from disk",
|
|
Execute: func(args string, ctx ext.Context) (string, error) {
|
|
ctx.Print("Reloading extensions...")
|
|
err := ctx.ReloadExtensions()
|
|
if err != nil {
|
|
return "", fmt.Errorf("reload failed: %w", err)
|
|
}
|
|
return "Extensions reloaded successfully.", nil
|
|
},
|
|
})
|
|
|
|
api.RegisterCommand(ext.CommandDef{
|
|
Name: "load-time",
|
|
Description: "Show when this extension was loaded",
|
|
Execute: func(args string, ctx ext.Context) (string, error) {
|
|
return fmt.Sprintf("This extension was loaded at %s", loadedAt), nil
|
|
},
|
|
})
|
|
|
|
api.OnSessionStart(func(e ext.SessionStartEvent, ctx ext.Context) {
|
|
ctx.Print(fmt.Sprintf("[dev-reload] Extension loaded at %s", loadedAt))
|
|
})
|
|
}
|