Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
783cf52
fix(core): repair graph execution engine correctness and concurrency
Aug 26, 2026
14df390
feat: add LangGraph conformance suite; fix checkpoint data loss
Aug 26, 2026
c85c4fd
fix(server): close security holes and implement the real graph API
Aug 26, 2026
9ca4e0d
fix(tools): confine filesystem, shell and network tools
Aug 26, 2026
68c601b
feat(llm): make provider failures classifiable and actually retry
Aug 26, 2026
e388a94
fix(persistence): remove panicking type assertions and cover the layer
Aug 26, 2026
8b95ad6
feat(e2e): pin the GoLangGraph Studio contract, fix three mismatches
Aug 26, 2026
0628ee5
test: add fuzz targets across the untrusted-input surfaces
Aug 26, 2026
7dc16f8
fix: handle errors that were silently discarded; make CI run the new …
Aug 26, 2026
019936e
fix: make the health check real and the agent image buildable
Aug 26, 2026
bc3a278
fix(agent): report which nodes ran; cover agent loops and tool calling
Aug 26, 2026
3f30bcf
fix(examples): repair two unbuildable examples; drop committed binaries
Aug 26, 2026
338f15a
docs: document production configuration and verify the examples compile
Aug 26, 2026
d85de2c
fix(llm): implement the Gemini provider, which was a mock
Aug 26, 2026
c537488
fix(server): serve real thread history and measured metrics
Aug 26, 2026
d42fe36
fix(server): validate against the schema instead of asserting validity
Aug 26, 2026
46a2551
fix: secure the second server, give agents identities, close ReAct ro…
Aug 27, 2026
0d2fe64
fix: repair the OpenAI provider, multi-agent runtime and database bac…
Aug 27, 2026
863bbc3
fix(cli,server): stop reporting success for work that never happened
Aug 27, 2026
21e0c0e
Merge origin/main: adopt org module path, reconcile agent and provide…
claude Aug 27, 2026
598b2ec
ci: repair the security scans, which have never once run
claude Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ concurrency:
cancel-in-progress: true

env:
GO_VERSION: '1.23'
GO_VERSION: '1.25'

jobs:
test:
Expand Down Expand Up @@ -69,7 +69,11 @@ jobs:

- name: Run tests
run: |
go test -v -race -coverprofile=coverage.out -covermode=atomic ./pkg/...
# The whole module: ./pkg/... alone skips the LangGraph conformance
# suite and the Studio end-to-end suite under ./test/....
go test -v -race -timeout 15m \
-coverpkg=./pkg/... -coverprofile=coverage.out -covermode=atomic \
./...
env:
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
Expand All @@ -79,6 +83,28 @@ jobs:
REDIS_HOST: localhost
REDIS_PORT: 6379

- name: Fuzz smoke test
run: |
# A short run of each target: enough to catch a regression that makes a
# fuzz target crash immediately, without lengthening CI.
set -e
for pkg_target in \
"./pkg/core FuzzStateJSONRoundTrip" \
"./pkg/core FuzzStateMarshalUnmarshal" \
"./pkg/core FuzzDeepCopy" \
"./pkg/core FuzzGraphRouting" \
"./pkg/core FuzzGraphConstruction" \
"./pkg/tools FuzzToolArguments" \
"./pkg/tools FuzzPathResolution" \
"./pkg/tools FuzzCommandPolicy" \
"./pkg/tools FuzzURLPolicy" \
"./pkg/server FuzzAPIRequestBodies" \
"./pkg/server FuzzAPIPaths" ; do
set -- $pkg_target
echo "fuzzing $2 in $1"
go test -run '^$' -fuzz "^$2$" -fuzztime=20s "$1"
done

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
Expand Down Expand Up @@ -245,7 +271,7 @@ jobs:

- name: Run integration tests
run: |
go test -v -tags=integration ./test/e2e/...
go test -v -race -timeout 15m ./test/e2e/...
env:
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ concurrency:
cancel-in-progress: true

env:
GO_VERSION: '1.23'
GO_VERSION: '1.25'

jobs:
build:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pre-commit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ concurrency:
cancel-in-progress: true

env:
GO_VERSION: '1.23'
GO_VERSION: '1.25'

jobs:
pre-commit:
Expand Down Expand Up @@ -118,7 +118,7 @@ jobs:
continue-on-error: true

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.25.0
uses: aquasecurity/trivy-action@v0.36.0
with:
scan-type: 'fs'
scan-ref: '.'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ concurrency:
cancel-in-progress: true

env:
GO_VERSION: '1.23'
GO_VERSION: '1.25'
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

Expand Down
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ bin/
*.so
*.dylib

# Compiled example binaries. These were previously committed, adding ~100 MB of
# platform-specific artifacts to every clone that could silently drift from the
# source they were built from. Build them with `go build ./...` in the example.
/examples/*/[0-9][0-9]-*
!/examples/*/[0-9][0-9]-*/
/examples/01-basic-chat/basic-chat
/examples/02-react-agent/react-agent
/examples/07-tools-integration/tools-integration
/examples/08-production-ready/production-ready
/examples/09-workflow-graph/workflow-graph
/examples/streaming-demo/streaming-demo

# Test binary, built with `go test -c`
*.test

Expand Down
13 changes: 9 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Build stage
FROM golang:1.23.10-alpine AS builder
FROM golang:1.25.13-alpine AS builder

# Set working directory
WORKDIR /app
Expand Down Expand Up @@ -47,9 +47,14 @@ USER golanggraph
# Expose port (adjust as needed)
EXPOSE 8080

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD ./golanggraph health || exit 1
# Health check.
#
# Probes the server's own endpoint rather than running a local dependency
# scan: the container is healthy when it is serving. A plain "health" run
# reports on dependencies, which is a different question and would mark a
# perfectly serving container unhealthy whenever an optional one is absent.
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD ["./golanggraph", "health", "--server", "http://127.0.0.1:8080"]

# Run the binary
ENTRYPOINT ["./golanggraph"]
Expand Down
22 changes: 12 additions & 10 deletions Dockerfile.agent
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Production Dockerfile for GoLangGraph Agent
FROM golang:1.23.10-alpine AS builder
FROM golang:1.25.13-alpine AS builder

# Set working directory
WORKDIR /app
Expand Down Expand Up @@ -37,12 +37,10 @@ WORKDIR /app
# Copy the binary from builder stage
COPY --from=builder /app/golanggraph-agent .

# Copy configuration files
COPY configs/ ./configs/
COPY static/ ./static/

# Create necessary directories and change ownership to non-root user
RUN mkdir -p ./logs ./data && \
# Create the directories the server may use. These were previously COPY'd from
# configs/ and static/, which do not exist in the repository, so this image
# could not be built at all. Mount or bake in real configuration as needed.
RUN mkdir -p ./configs ./static ./logs ./data && \
chown -R golanggraph:golanggraph /app

# Switch to non-root user
Expand All @@ -51,9 +49,13 @@ USER golanggraph
# Expose port
EXPOSE 8080

# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD ./golanggraph-agent health || exit 1
# Health check.
#
# Probes the server's own endpoint: the container is healthy when it is
# serving. A local dependency scan is a different question and would mark a
# perfectly serving container unhealthy whenever an optional service is absent.
HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
CMD ["./golanggraph-agent", "health", "--server", "http://127.0.0.1:8080"]

# Run the agent
ENTRYPOINT ["./golanggraph-agent"]
Expand Down
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,26 @@ if err != nil {
fmt.Printf("🔄 Graph Result: %v\n", result.Get("response"))
```

## 🔒 Production Deployment

Defaults favour local development. Before exposing GoLangGraph to real traffic,
read **[docs/PRODUCTION.md](docs/PRODUCTION.md)**, which covers:

- **Authentication and CORS** — `RequireAuth` is off by default, and the allowed-origin list also governs WebSocket upgrades.
- **Tool sandboxing** — filesystem confinement, the shell allowlist, and SSRF protection for the HTTP tool.
- **Durable execution** — checkpointing, resume after a crash, and human-in-the-loop interrupts.
- **Health checking** — which probe belongs in a container, and which does not.
- **Typed errors, retries, concurrency and observability.**

LangGraph compatibility, including the places GoLangGraph intentionally
differs, is documented in
**[test/conformance/DEVIATIONS.md](test/conformance/DEVIATIONS.md)** and
enforced by the conformance suite:

```bash
go test -race ./test/conformance/...
```

## 🏗️ Architecture

GoLangGraph follows a modular architecture:
Expand Down
Loading
Loading