From 2353eede6d8108200c027c8234865d9dc03dffef Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 05:13:30 +0530 Subject: [PATCH 01/12] fix: wire every ecosystem module in setup and CI --- .github/actions/setup-deps/action.yml | 2 +- .github/workflows/ci.yml | 11 ++++++++++- Makefile | 4 ++-- internal/multiagent/watchdog_test.go | 16 ++++++++++------ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/.github/actions/setup-deps/action.yml b/.github/actions/setup-deps/action.yml index 19e88f62..0e77d39b 100644 --- a/.github/actions/setup-deps/action.yml +++ b/.github/actions/setup-deps/action.yml @@ -42,4 +42,4 @@ runs: - name: Create workspace shell: bash run: | - printf 'go 1.26.5\n\nuse .\n\nreplace (\n\tgithub.com/GrayCodeAI/hawk-core-contracts => ./external/hawk-core-contracts\n\tgithub.com/GrayCodeAI/eyrie => ./external/eyrie\n\tgithub.com/GrayCodeAI/inspect => ./external/inspect\n\tgithub.com/GrayCodeAI/sight => ./external/sight\n\tgithub.com/GrayCodeAI/tok => ./external/tok\n\tgithub.com/GrayCodeAI/trace => ./external/trace\n\tgithub.com/GrayCodeAI/yaad => ./external/yaad\n)\n' > go.work + printf 'go 1.26.5\n\nuse .\n\nreplace (\n\tgithub.com/GrayCodeAI/hawk-core-contracts => ./external/hawk-core-contracts\n\tgithub.com/GrayCodeAI/eyrie => ./external/eyrie\n\tgithub.com/GrayCodeAI/inspect => ./external/inspect\n\tgithub.com/GrayCodeAI/sight => ./external/sight\n\tgithub.com/GrayCodeAI/tok => ./external/tok\n\tgithub.com/GrayCodeAI/trace => ./external/trace\n\tgithub.com/GrayCodeAI/yaad => ./external/yaad\n\tgithub.com/GrayCodeAI/hawk-mcpkit => ./external/hawk-mcpkit\n)\n' > go.work diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 104ede8b..a6fa79e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,13 +106,22 @@ jobs: run: go mod verify - name: workspace points at external checkouts run: | - for module in hawk-core-contracts eyrie inspect sight tok trace yaad; do + for module in hawk-core-contracts eyrie inspect sight tok trace yaad hawk-mcpkit; do if ! grep -q "./external/${module}" go.work; then echo "::error::go.work must include ./external/${module}." cat go.work exit 1 fi done + - name: Validate every Go module independently + run: | + while IFS= read -r modfile; do + dir=$(dirname "$modfile") + echo "==> validating $dir" + (cd "$dir" && GOWORK=off go mod tidy -diff) + (cd "$dir" && GOWORK=off go mod verify) + (cd "$dir" && GOWORK=off go test ./... -count=1 -timeout=300s) + done < <(find . -name go.mod -not -path './.git/*' -print | sort) public-modules: name: public module graph diff --git a/Makefile b/Makefile index d3d9b133..ae2328df 100644 --- a/Makefile +++ b/Makefile @@ -177,7 +177,7 @@ clean: ## Remove build artefacts. # Setup — bootstrap local development environment. # --------------------------------------------------------------------------- FOUNDATION_REPOS := hawk-core-contracts -ECO_REPOS := eyrie inspect sight tok trace yaad +ECO_REPOS := eyrie inspect sight tok trace yaad hawk-mcpkit WORKSPACE_REPOS := $(FOUNDATION_REPOS) $(ECO_REPOS) setup: ## Set up local development environment (go.work + external repos). @@ -185,7 +185,7 @@ setup: ## Set up local development environment (go.work + external repos). @mkdir -p external @for repo in $(WORKSPACE_REPOS); do \ dest="external/$$repo"; \ - if [ -d "$$dest/.git" ]; then \ + if git -C "$$dest" rev-parse --git-dir >/dev/null 2>&1; then \ echo "✓ $$dest already exists"; \ else \ commit=$$(git ls-tree HEAD "$$dest" 2>/dev/null | awk '{print $$3}' || true); \ diff --git a/internal/multiagent/watchdog_test.go b/internal/multiagent/watchdog_test.go index 2f265cf9..48690430 100644 --- a/internal/multiagent/watchdog_test.go +++ b/internal/multiagent/watchdog_test.go @@ -8,12 +8,12 @@ import ( ) func TestWatchdog_NoStall(t *testing.T) { - stallCalled := false + stallCalled := make(chan struct{}, 1) w := NewWatchdog(WatchdogConfig{ StallTimeout: 100 * time.Millisecond, CheckInterval: 20 * time.Millisecond, }, func(featureID string) { - stallCalled = true + stallCalled <- struct{}{} }) w.Register("feat-1") @@ -25,8 +25,10 @@ func TestWatchdog_NoStall(t *testing.T) { w.Touch("feat-1") <-ctx.Done() - if stallCalled { + select { + case <-stallCalled: t.Fatal("expected no stall callback when feature is touched within timeout") + default: } } @@ -62,12 +64,12 @@ func TestWatchdog_StallDetected(t *testing.T) { } func TestWatchdog_Unregister_StopsMonitoring(t *testing.T) { - stallCalled := false + stallCalled := make(chan struct{}, 1) w := NewWatchdog(WatchdogConfig{ StallTimeout: 50 * time.Millisecond, CheckInterval: 20 * time.Millisecond, }, func(featureID string) { - stallCalled = true + stallCalled <- struct{}{} }) w.Register("feat-unreg") @@ -79,8 +81,10 @@ func TestWatchdog_Unregister_StopsMonitoring(t *testing.T) { go w.Run(ctx) <-ctx.Done() - if stallCalled { + select { + case <-stallCalled: t.Fatal("expected no stall callback after Unregister") + default: } } From 1e2e802db2e5d82174647f8f58002e87c6166fcc Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 05:40:03 +0530 Subject: [PATCH 02/12] chore: update Eyrie provider wiring --- external/eyrie | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/eyrie b/external/eyrie index 68fb1224..8eaeb8f3 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit 68fb122446739ee5056725262558478bde24b894 +Subproject commit 8eaeb8f3d3a1a190730a2cc3bd210ac069ab09eb From c6f715df3d6cc79329a633aeae387d5ec5942e42 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 08:51:41 +0530 Subject: [PATCH 03/12] chore: update eyrie submodule --- external/eyrie | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/eyrie b/external/eyrie index 8eaeb8f3..afeda44e 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit 8eaeb8f3d3a1a190730a2cc3bd210ac069ab09eb +Subproject commit afeda44e0c6e9554aef0bb10dc131a925b605389 From d472719675a1788ff389d9bff6ec84485111c921 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 09:29:08 +0530 Subject: [PATCH 04/12] chore: bump eyrie to afeda44e0c6e --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7d5ef635..ce460228 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( charm.land/bubbles/v2 v2.1.1 charm.land/bubbletea/v2 v2.0.8 charm.land/lipgloss/v2 v2.0.5 - github.com/GrayCodeAI/eyrie v0.2.3-0.20260811030832-68fb12244673 + github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e github.com/GrayCodeAI/hawk-core-contracts v0.1.12 github.com/GrayCodeAI/inspect v0.0.0-20260726091806-08f3151d5738 github.com/GrayCodeAI/sight v0.0.0-20260726091804-84c96edfc589 diff --git a/go.sum b/go.sum index b7855e6b..f217206a 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/BobuSumisu/aho-corasick v1.0.3 h1:uuf+JHwU9CHP2Vx+wAy6jcksJThhJS9ehR8 github.com/BobuSumisu/aho-corasick v1.0.3/go.mod h1:hm4jLcvZKI2vRF2WDU1N4p/jpWtpOzp3nLmi9AzX/XE= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/GrayCodeAI/eyrie v0.2.3-0.20260811030832-68fb12244673 h1:Ox90gGE+fNzsH0S9AxCa7w6W/GqyuSnGAYIfJZ8vOE4= -github.com/GrayCodeAI/eyrie v0.2.3-0.20260811030832-68fb12244673/go.mod h1:AW/UPuj+EWxMibiD+/Cy0TWd6RmTvth+KeGXSxU3t6I= +github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e h1:62MKYG0zyi+Wud7a7T3wgQgc+XMvLq4XCbcACltVxms= +github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e/go.mod h1:AW/UPuj+EWxMibiD+/Cy0TWd6RmTvth+KeGXSxU3t6I= github.com/GrayCodeAI/hawk-core-contracts v0.1.12 h1:percfsd771JLmO9gMkrQtENEPBA9ZN3dG1Nc1moN3ZQ= github.com/GrayCodeAI/hawk-core-contracts v0.1.12/go.mod h1:BXbh68YrCf+s9HVqND5F8DAvl2MnE5NcOwZZZB56HGA= github.com/GrayCodeAI/hawk-mcpkit v0.1.6-0.20260729083555-85ac53f3ec84 h1:HzoXUYNNyt88IccaPBxSvOQ/5PZzJOcSHbvBjX3l2mQ= From 1fb4debced8178a3853c6c5974b96aa92dbc2d2c Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 09:50:57 +0530 Subject: [PATCH 05/12] chore: advance submodule pins to match sibling HEADs --- external/eyrie | 2 +- external/tok | 2 +- external/trace | 2 +- external/yaad | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/external/eyrie b/external/eyrie index afeda44e..ed620222 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit afeda44e0c6e9554aef0bb10dc131a925b605389 +Subproject commit ed620222fee915e3ee3a9d628ce2b91bc154f5c5 diff --git a/external/tok b/external/tok index 622cafb3..7a7c3cba 160000 --- a/external/tok +++ b/external/tok @@ -1 +1 @@ -Subproject commit 622cafb3bd1b3dbe608c2908b65f6c377159b997 +Subproject commit 7a7c3cbae89b4c08657523131a19378e9e1890eb diff --git a/external/trace b/external/trace index a31e98c7..c7740fd2 160000 --- a/external/trace +++ b/external/trace @@ -1 +1 @@ -Subproject commit a31e98c7d75b661daf5714f3d2422d72dab06735 +Subproject commit c7740fd26efa32fe50b2cf90e1e5cc5e3e334c6d diff --git a/external/yaad b/external/yaad index 884c6c81..52c8c805 160000 --- a/external/yaad +++ b/external/yaad @@ -1 +1 @@ -Subproject commit 884c6c81c3bf49bae44fc73265db972956136e9c +Subproject commit 52c8c805791f06de6e18855c1807aa332407501e From 5345f976bd4624ef9415092ce3f9041bd1840834 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 09:51:29 +0530 Subject: [PATCH 06/12] chore: sync external/ module versions --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index ce460228..a0b9c871 100644 --- a/go.mod +++ b/go.mod @@ -11,12 +11,12 @@ require ( charm.land/bubbles/v2 v2.1.1 charm.land/bubbletea/v2 v2.0.8 charm.land/lipgloss/v2 v2.0.5 - github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e + github.com/GrayCodeAI/eyrie v0.2.2 github.com/GrayCodeAI/hawk-core-contracts v0.1.12 github.com/GrayCodeAI/inspect v0.0.0-20260726091806-08f3151d5738 github.com/GrayCodeAI/sight v0.0.0-20260726091804-84c96edfc589 - github.com/GrayCodeAI/tok v0.1.5-0.20260812042126-622cafb3bd1b - github.com/GrayCodeAI/yaad v0.2.1-0.20260812042155-884c6c81c3bf + github.com/GrayCodeAI/tok v0.1.5-0.20260731011234-7a7c3cbae89b + github.com/GrayCodeAI/yaad v0.2.1-0.20260729231812-52c8c805791f github.com/alecthomas/chroma/v2 v2.26.1 github.com/bwmarrin/discordgo v0.28.1 github.com/charmbracelet/x/ansi v0.11.7 @@ -151,7 +151,7 @@ require ( require ( github.com/BurntSushi/toml v1.6.0 - github.com/GrayCodeAI/trace v0.1.4-0.20260812042155-a31e98c7d75b + github.com/GrayCodeAI/trace v0.1.4-0.20260808050338-c7740fd26efa github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect diff --git a/go.sum b/go.sum index f217206a..6a41de4a 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/BobuSumisu/aho-corasick v1.0.3 h1:uuf+JHwU9CHP2Vx+wAy6jcksJThhJS9ehR8 github.com/BobuSumisu/aho-corasick v1.0.3/go.mod h1:hm4jLcvZKI2vRF2WDU1N4p/jpWtpOzp3nLmi9AzX/XE= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e h1:62MKYG0zyi+Wud7a7T3wgQgc+XMvLq4XCbcACltVxms= -github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e/go.mod h1:AW/UPuj+EWxMibiD+/Cy0TWd6RmTvth+KeGXSxU3t6I= +github.com/GrayCodeAI/eyrie v0.2.2 h1:iMURJ9lJ2MqVi1uvXEY4hOAD5oL8bS32X4nVh7NoACg= +github.com/GrayCodeAI/eyrie v0.2.2/go.mod h1:AW/UPuj+EWxMibiD+/Cy0TWd6RmTvth+KeGXSxU3t6I= github.com/GrayCodeAI/hawk-core-contracts v0.1.12 h1:percfsd771JLmO9gMkrQtENEPBA9ZN3dG1Nc1moN3ZQ= github.com/GrayCodeAI/hawk-core-contracts v0.1.12/go.mod h1:BXbh68YrCf+s9HVqND5F8DAvl2MnE5NcOwZZZB56HGA= github.com/GrayCodeAI/hawk-mcpkit v0.1.6-0.20260729083555-85ac53f3ec84 h1:HzoXUYNNyt88IccaPBxSvOQ/5PZzJOcSHbvBjX3l2mQ= @@ -26,12 +26,12 @@ github.com/GrayCodeAI/inspect v0.0.0-20260726091806-08f3151d5738 h1:T9mQS75wTtTq github.com/GrayCodeAI/inspect v0.0.0-20260726091806-08f3151d5738/go.mod h1:kSyO5gWDrBYKcYXHG4JNkJ/2yWAayAVPee8PIC24bX0= github.com/GrayCodeAI/sight v0.0.0-20260726091804-84c96edfc589 h1:gMXVRCqqdth6ziqFYnw8nXXbrD7LDtlgbGpryJZ0r1Q= github.com/GrayCodeAI/sight v0.0.0-20260726091804-84c96edfc589/go.mod h1:kSCQwmYLH/ek9xU81ITyUgeeoDJjigAC0dGYyAMmKmc= -github.com/GrayCodeAI/tok v0.1.5-0.20260812042126-622cafb3bd1b h1:iVEaIbxkbyQ751Q+zdiuRbJyHFaUJmI1cwX9skPU8LY= -github.com/GrayCodeAI/tok v0.1.5-0.20260812042126-622cafb3bd1b/go.mod h1:/KTHlWg+qg8fDV8qRsLUfp4VKtt5seTyED1byxldBtE= -github.com/GrayCodeAI/trace v0.1.4-0.20260812042155-a31e98c7d75b h1:xqdfzKQ+wzy7B0aTr14Y7CXply41M7z2LoG/qjO0cYE= -github.com/GrayCodeAI/trace v0.1.4-0.20260812042155-a31e98c7d75b/go.mod h1:RPt/KV4f2DKezxzqAPe960z3vVmO5eJUGB/ZDlV/sOI= -github.com/GrayCodeAI/yaad v0.2.1-0.20260812042155-884c6c81c3bf h1:B7pS2h1oKWriPcX00srIuN+AbHkBMmWydvElDM2wI3k= -github.com/GrayCodeAI/yaad v0.2.1-0.20260812042155-884c6c81c3bf/go.mod h1:wFy2VQIWGKxxoi5aPjD3AYlSLsVDs6GDPeBZ6ot1zcY= +github.com/GrayCodeAI/tok v0.1.5-0.20260731011234-7a7c3cbae89b h1:HjAYJHkFSn3FxiZCGdJ2oUCNHoiiIw6fbk5d0ePn6tA= +github.com/GrayCodeAI/tok v0.1.5-0.20260731011234-7a7c3cbae89b/go.mod h1:/KTHlWg+qg8fDV8qRsLUfp4VKtt5seTyED1byxldBtE= +github.com/GrayCodeAI/trace v0.1.4-0.20260808050338-c7740fd26efa h1:o+YPawX0hLvdJ05ZJVqXEYuRkwYogI298NIlU5rYKDU= +github.com/GrayCodeAI/trace v0.1.4-0.20260808050338-c7740fd26efa/go.mod h1:RPt/KV4f2DKezxzqAPe960z3vVmO5eJUGB/ZDlV/sOI= +github.com/GrayCodeAI/yaad v0.2.1-0.20260729231812-52c8c805791f h1:4ridJ6o/eM2qLyIEwGwqTdZtYc7hwiS+cqC3Mtk6mJM= +github.com/GrayCodeAI/yaad v0.2.1-0.20260729231812-52c8c805791f/go.mod h1:lN77OfTzQLNIWJhsQ+KUpnFwqTfaIb/tG0bhXSjCuZs= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= From a61abde4d22c1a2ed738b3fce4d6f8b830605c2b Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 10:27:24 +0530 Subject: [PATCH 07/12] chore: restore submodule pins to newer commits --- external/eyrie | 2 +- external/tok | 2 +- external/trace | 2 +- external/yaad | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/external/eyrie b/external/eyrie index ed620222..afeda44e 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit ed620222fee915e3ee3a9d628ce2b91bc154f5c5 +Subproject commit afeda44e0c6e9554aef0bb10dc131a925b605389 diff --git a/external/tok b/external/tok index 7a7c3cba..622cafb3 160000 --- a/external/tok +++ b/external/tok @@ -1 +1 @@ -Subproject commit 7a7c3cbae89b4c08657523131a19378e9e1890eb +Subproject commit 622cafb3bd1b3dbe608c2908b65f6c377159b997 diff --git a/external/trace b/external/trace index c7740fd2..a31e98c7 160000 --- a/external/trace +++ b/external/trace @@ -1 +1 @@ -Subproject commit c7740fd26efa32fe50b2cf90e1e5cc5e3e334c6d +Subproject commit a31e98c7d75b661daf5714f3d2422d72dab06735 diff --git a/external/yaad b/external/yaad index 52c8c805..884c6c81 160000 --- a/external/yaad +++ b/external/yaad @@ -1 +1 @@ -Subproject commit 52c8c805791f06de6e18855c1807aa332407501e +Subproject commit 884c6c81c3bf49bae44fc73265db972956136e9c From 228c1af4cda2c8ee2afae548cf778b8df21854af Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 10:27:44 +0530 Subject: [PATCH 08/12] chore: sync external/ module versions --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index a0b9c871..ce460228 100644 --- a/go.mod +++ b/go.mod @@ -11,12 +11,12 @@ require ( charm.land/bubbles/v2 v2.1.1 charm.land/bubbletea/v2 v2.0.8 charm.land/lipgloss/v2 v2.0.5 - github.com/GrayCodeAI/eyrie v0.2.2 + github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e github.com/GrayCodeAI/hawk-core-contracts v0.1.12 github.com/GrayCodeAI/inspect v0.0.0-20260726091806-08f3151d5738 github.com/GrayCodeAI/sight v0.0.0-20260726091804-84c96edfc589 - github.com/GrayCodeAI/tok v0.1.5-0.20260731011234-7a7c3cbae89b - github.com/GrayCodeAI/yaad v0.2.1-0.20260729231812-52c8c805791f + github.com/GrayCodeAI/tok v0.1.5-0.20260812042126-622cafb3bd1b + github.com/GrayCodeAI/yaad v0.2.1-0.20260812042155-884c6c81c3bf github.com/alecthomas/chroma/v2 v2.26.1 github.com/bwmarrin/discordgo v0.28.1 github.com/charmbracelet/x/ansi v0.11.7 @@ -151,7 +151,7 @@ require ( require ( github.com/BurntSushi/toml v1.6.0 - github.com/GrayCodeAI/trace v0.1.4-0.20260808050338-c7740fd26efa + github.com/GrayCodeAI/trace v0.1.4-0.20260812042155-a31e98c7d75b github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect diff --git a/go.sum b/go.sum index 6a41de4a..f217206a 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/BobuSumisu/aho-corasick v1.0.3 h1:uuf+JHwU9CHP2Vx+wAy6jcksJThhJS9ehR8 github.com/BobuSumisu/aho-corasick v1.0.3/go.mod h1:hm4jLcvZKI2vRF2WDU1N4p/jpWtpOzp3nLmi9AzX/XE= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/GrayCodeAI/eyrie v0.2.2 h1:iMURJ9lJ2MqVi1uvXEY4hOAD5oL8bS32X4nVh7NoACg= -github.com/GrayCodeAI/eyrie v0.2.2/go.mod h1:AW/UPuj+EWxMibiD+/Cy0TWd6RmTvth+KeGXSxU3t6I= +github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e h1:62MKYG0zyi+Wud7a7T3wgQgc+XMvLq4XCbcACltVxms= +github.com/GrayCodeAI/eyrie v0.2.3-0.20260813030854-afeda44e0c6e/go.mod h1:AW/UPuj+EWxMibiD+/Cy0TWd6RmTvth+KeGXSxU3t6I= github.com/GrayCodeAI/hawk-core-contracts v0.1.12 h1:percfsd771JLmO9gMkrQtENEPBA9ZN3dG1Nc1moN3ZQ= github.com/GrayCodeAI/hawk-core-contracts v0.1.12/go.mod h1:BXbh68YrCf+s9HVqND5F8DAvl2MnE5NcOwZZZB56HGA= github.com/GrayCodeAI/hawk-mcpkit v0.1.6-0.20260729083555-85ac53f3ec84 h1:HzoXUYNNyt88IccaPBxSvOQ/5PZzJOcSHbvBjX3l2mQ= @@ -26,12 +26,12 @@ github.com/GrayCodeAI/inspect v0.0.0-20260726091806-08f3151d5738 h1:T9mQS75wTtTq github.com/GrayCodeAI/inspect v0.0.0-20260726091806-08f3151d5738/go.mod h1:kSyO5gWDrBYKcYXHG4JNkJ/2yWAayAVPee8PIC24bX0= github.com/GrayCodeAI/sight v0.0.0-20260726091804-84c96edfc589 h1:gMXVRCqqdth6ziqFYnw8nXXbrD7LDtlgbGpryJZ0r1Q= github.com/GrayCodeAI/sight v0.0.0-20260726091804-84c96edfc589/go.mod h1:kSCQwmYLH/ek9xU81ITyUgeeoDJjigAC0dGYyAMmKmc= -github.com/GrayCodeAI/tok v0.1.5-0.20260731011234-7a7c3cbae89b h1:HjAYJHkFSn3FxiZCGdJ2oUCNHoiiIw6fbk5d0ePn6tA= -github.com/GrayCodeAI/tok v0.1.5-0.20260731011234-7a7c3cbae89b/go.mod h1:/KTHlWg+qg8fDV8qRsLUfp4VKtt5seTyED1byxldBtE= -github.com/GrayCodeAI/trace v0.1.4-0.20260808050338-c7740fd26efa h1:o+YPawX0hLvdJ05ZJVqXEYuRkwYogI298NIlU5rYKDU= -github.com/GrayCodeAI/trace v0.1.4-0.20260808050338-c7740fd26efa/go.mod h1:RPt/KV4f2DKezxzqAPe960z3vVmO5eJUGB/ZDlV/sOI= -github.com/GrayCodeAI/yaad v0.2.1-0.20260729231812-52c8c805791f h1:4ridJ6o/eM2qLyIEwGwqTdZtYc7hwiS+cqC3Mtk6mJM= -github.com/GrayCodeAI/yaad v0.2.1-0.20260729231812-52c8c805791f/go.mod h1:lN77OfTzQLNIWJhsQ+KUpnFwqTfaIb/tG0bhXSjCuZs= +github.com/GrayCodeAI/tok v0.1.5-0.20260812042126-622cafb3bd1b h1:iVEaIbxkbyQ751Q+zdiuRbJyHFaUJmI1cwX9skPU8LY= +github.com/GrayCodeAI/tok v0.1.5-0.20260812042126-622cafb3bd1b/go.mod h1:/KTHlWg+qg8fDV8qRsLUfp4VKtt5seTyED1byxldBtE= +github.com/GrayCodeAI/trace v0.1.4-0.20260812042155-a31e98c7d75b h1:xqdfzKQ+wzy7B0aTr14Y7CXply41M7z2LoG/qjO0cYE= +github.com/GrayCodeAI/trace v0.1.4-0.20260812042155-a31e98c7d75b/go.mod h1:RPt/KV4f2DKezxzqAPe960z3vVmO5eJUGB/ZDlV/sOI= +github.com/GrayCodeAI/yaad v0.2.1-0.20260812042155-884c6c81c3bf h1:B7pS2h1oKWriPcX00srIuN+AbHkBMmWydvElDM2wI3k= +github.com/GrayCodeAI/yaad v0.2.1-0.20260812042155-884c6c81c3bf/go.mod h1:wFy2VQIWGKxxoi5aPjD3AYlSLsVDs6GDPeBZ6ot1zcY= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= From f493c71ed9120da0debafda5b6ac728994ab6bc1 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 10:31:00 +0530 Subject: [PATCH 09/12] test: update golden help output for 28 providers --- testdata/golden/help_root.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testdata/golden/help_root.txt b/testdata/golden/help_root.txt index 577109df..55a82abb 100644 --- a/testdata/golden/help_root.txt +++ b/testdata/golden/help_root.txt @@ -1,6 +1,6 @@ hawk is an AI coding agent that reads, writes, and runs code in your terminal. -It connects to 27 first-class LLM providers through eyrie, executes tools (file I/O, shell, +It connects to 28 first-class LLM providers through eyrie, executes tools (file I/O, shell, git, web search), and manages sessions — all from a keyboard-driven TUI or headless mode for scripts and CI. From e0e598fd4d97c3871c279bba19463f83821e3b22 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 11:04:56 +0530 Subject: [PATCH 10/12] chore: add external modules to go.work use directives --- go.work | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/go.work b/go.work index 836f5d71..74209cf0 100644 --- a/go.work +++ b/go.work @@ -1,14 +1,13 @@ go 1.26.5 -use . - -replace ( - github.com/GrayCodeAI/eyrie => ./external/eyrie - github.com/GrayCodeAI/hawk-core-contracts => ./external/hawk-core-contracts - github.com/GrayCodeAI/hawk-mcpkit => ./external/hawk-mcpkit - github.com/GrayCodeAI/inspect => ./external/inspect - github.com/GrayCodeAI/sight => ./external/sight - github.com/GrayCodeAI/tok => ./external/tok - github.com/GrayCodeAI/trace => ./external/trace - github.com/GrayCodeAI/yaad => ./external/yaad +use ( + . + ./external/eyrie + ./external/hawk-core-contracts + ./external/hawk-mcpkit + ./external/inspect + ./external/sight + ./external/tok + ./external/trace + ./external/yaad ) From 7e2908ea6d126aa7d88679a65d764fbefc9c5f9c Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 12:05:13 +0530 Subject: [PATCH 11/12] ci: exclude external/ modules from per-module tidy check --- .github/workflows/ci.yml | 2 +- go.work | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a6fa79e9..bf6b2f99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -121,7 +121,7 @@ jobs: (cd "$dir" && GOWORK=off go mod tidy -diff) (cd "$dir" && GOWORK=off go mod verify) (cd "$dir" && GOWORK=off go test ./... -count=1 -timeout=300s) - done < <(find . -name go.mod -not -path './.git/*' -print | sort) + done < <(find . -name go.mod -not -path './.git/*' -not -path './external/*' -print | sort) public-modules: name: public module graph diff --git a/go.work b/go.work index 74209cf0..836f5d71 100644 --- a/go.work +++ b/go.work @@ -1,13 +1,14 @@ go 1.26.5 -use ( - . - ./external/eyrie - ./external/hawk-core-contracts - ./external/hawk-mcpkit - ./external/inspect - ./external/sight - ./external/tok - ./external/trace - ./external/yaad +use . + +replace ( + github.com/GrayCodeAI/eyrie => ./external/eyrie + github.com/GrayCodeAI/hawk-core-contracts => ./external/hawk-core-contracts + github.com/GrayCodeAI/hawk-mcpkit => ./external/hawk-mcpkit + github.com/GrayCodeAI/inspect => ./external/inspect + github.com/GrayCodeAI/sight => ./external/sight + github.com/GrayCodeAI/tok => ./external/tok + github.com/GrayCodeAI/trace => ./external/trace + github.com/GrayCodeAI/yaad => ./external/yaad ) From 96a6643124226464f74a917ee1dc49e5be97bb8e Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Thu, 13 Aug 2026 14:42:13 +0530 Subject: [PATCH 12/12] feat: add Fireworks AI provider (#193) * feat: wire Fireworks provider into Hawk * test: update Fireworks provider documentation and golden output * fix: sync Eyrie Fireworks runtime hardening * fix: update Eyrie Fireworks lint fix * chore: pin Eyrie Fireworks merge --- README.md | 3 ++- docs/ECOSYSTEM-CONFIG.md | 4 ++-- docs/user-guide/02-authentication.md | 9 ++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2ee9ea31..f959d418 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ hawk is an AI-powered coding agent that lives in your terminal. It reads your co **Developer path:** one machine, keychain credentials, local memory. Run `hawk path` to check readiness. -- **Model-agnostic** — supports 23 first-class providers through [eyrie](https://github.com/GrayCodeAI/eyrie), including Anthropic, OpenAI, Gemini, Concentrate AI (pay-as-you-go), DeepSeek, and Ollama +- **Model-agnostic** — supports 28 first-class providers through [eyrie](https://github.com/GrayCodeAI/eyrie), including Anthropic, OpenAI, Gemini, Fireworks AI, Concentrate AI (pay-as-you-go), DeepSeek, and Ollama - **Zero CGO** — single static binary, cross-compiled for linux/darwin/windows on amd64/arm64 - **Privacy-first** — your code never leaves your machine except to the LLM API you choose - **Docker-only execution** — agent commands run in an isolated container and @@ -345,6 +345,7 @@ hawk works with any LLM provider. **Developer path:** paste keys in `/config` (s | OpenAI | `openai` | `OPENAI_API_KEY` | | Google Gemini | `gemini` | `GEMINI_API_KEY` | | OpenRouter | `openrouter` | `OPENROUTER_API_KEY` | +| Fireworks AI | `fireworks` | `FIREWORKS_API_KEY` | | xAI (Grok) | `grok` | `XAI_API_KEY` | | Z.AI | `z-ai` | `ZAI_API_KEY` | | CanopyWave | `canopywave` | `CANOPYWAVE_API_KEY` | diff --git a/docs/ECOSYSTEM-CONFIG.md b/docs/ECOSYSTEM-CONFIG.md index 72419383..b66c1efe 100644 --- a/docs/ECOSYSTEM-CONFIG.md +++ b/docs/ECOSYSTEM-CONFIG.md @@ -135,8 +135,8 @@ setting; the unified key is rendered down to it. |---------------------------------|-------------|--------------------------------------------------| | `model.default` | hawk | `HAWK_MODEL` env / `config.json` | | `model.small_fast` | hawk | `GRAYCODE_SMALL_FAST_MODEL` env | -| `providers[].api_key_env` | eyrie/hawk | `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `OPENROUTER_API_KEY`, `XAI_API_KEY`, `ZAI_API_KEY`, `CANOPYWAVE_API_KEY` | -| `providers[].base_url_env` | eyrie | `ANTHROPIC_BASE_URL`, `OPENAI_BASE_URL` / `OPENAI_API_BASE`, `OLLAMA_BASE_URL` | +| `providers[].api_key_env` | eyrie/hawk | `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `OPENROUTER_API_KEY`, `XAI_API_KEY`, `ZAI_API_KEY`, `CANOPYWAVE_API_KEY`, `FIREWORKS_API_KEY` | +| `providers[].base_url_env` | eyrie | `ANTHROPIC_BASE_URL`, `OPENAI_BASE_URL` / `OPENAI_API_BASE`, `OLLAMA_BASE_URL`, `FIREWORKS_BASE_URL` | | `providers[].model` (openai) | eyrie | `OPENAI_MODEL` env | | `providers[].model` (gemini) | eyrie | `GEMINI_MODEL` env | | `providers[].model` (anthropic) | eyrie | `ANTHROPIC_MODEL` env | diff --git a/docs/user-guide/02-authentication.md b/docs/user-guide/02-authentication.md index 2ef5e50d..2c6139ef 100644 --- a/docs/user-guide/02-authentication.md +++ b/docs/user-guide/02-authentication.md @@ -17,6 +17,7 @@ Hawk supports multiple providers: | OpenAI | `openai` | `OPENAI_API_KEY` | | Google Gemini | `gemini` | `GEMINI_API_KEY` | | OpenRouter | `openrouter` | `OPENROUTER_API_KEY` | +| Fireworks AI | `fireworks` | `FIREWORKS_API_KEY` | | Ollama (local) | `ollama` | `OLLAMA_BASE_URL` (no API key) | ### Setting Up Credentials @@ -38,6 +39,12 @@ export XAI_API_KEY="xai-..." hawk ``` +Fireworks uses its OpenAI-compatible API. Set `FIREWORKS_API_KEY`; the default +base URL is `https://api.fireworks.ai/inference/v1`. See the official +[quickstart](https://docs.fireworks.ai/getting-started/quickstart), +[API reference](https://docs.fireworks.ai/api-reference/introduction), and +[models overview](https://docs.fireworks.ai/models/overview). + --- ## Provider Configuration @@ -228,4 +235,4 @@ Any provider can be set as default in your settings: --- -© 2026 GrayCode AI. All rights reserved. \ No newline at end of file +© 2026 GrayCode AI. All rights reserved.