Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b4a3150
feat(fh-agent): site.spec.yaml → deployable edge-agent bundle compiler
May 30, 2026
0fb4ef9
feat(fh-agent): contract-schema validation via fh-builder subprocess
May 30, 2026
f29f5d2
docs(fh-agent): add ROADMAP.md alongside the CLI
May 30, 2026
d3134cc
chore(llmproxy): remove commented-out resilience.go stub
May 31, 2026
a00e795
chore(deps): add dependabot config for go, npm, actions
May 31, 2026
29604af
chore: add FUNDING.yml
May 31, 2026
da1bd3b
chore: add CODEOWNERS for routing reviews
May 31, 2026
fb9ad66
chore: add .editorconfig
May 31, 2026
464bd65
fix(engine): use constant-time compare for bearer token
May 31, 2026
dc24a2b
docs: add initial CHANGELOG.md with v1.0.1 backfill
May 31, 2026
13ba619
ci: add Spectral OpenAPI lint for contract/
May 31, 2026
690718b
fix(engine): expose /healthz without auth
May 31, 2026
85bad59
fix(httpclient): set default 30s timeout to avoid backend hangs
May 31, 2026
4c71a9d
ci: add lint workflow (golangci-lint + eslint)
May 31, 2026
a615599
chore: add issue-template chooser config
May 31, 2026
72f6144
chore(ts): switch workflow-core publish target to npmjs.org public re…
May 31, 2026
0a378fa
chore(ts): switch workflow-builder publish target to npmjs.org public…
May 31, 2026
39f33f7
docs(readme): rewrite hero with verified container size and real I/O …
May 31, 2026
49ac9a5
ci: add multi-arch container release workflow with cosign signing
May 31, 2026
e87f4c4
docs(readme): add go-version, stars, last-commit, and issues badges
May 31, 2026
bcc49ab
docs(releasing): update npm publish instructions for npmjs.org
May 31, 2026
6609ba0
ci: add CodeQL security scan for Go and TypeScript
May 31, 2026
b8e9bf6
docs(readme): add Why edge-agents comparison section before Quickstart
May 31, 2026
2098a52
ci: add gitleaks secret scan workflow
May 31, 2026
f640d45
docs(changelog): fix npm scope @foresthub → @foresthubai for ts packages
May 31, 2026
31f0b1b
ci: pin stoplightio/spectral-action version (drop @latest)
May 31, 2026
495846a
docs(codeowners): fix contract description (OpenAPI, not protobuf/JSO…
May 31, 2026
96b24a5
chore(llmproxy/config): remove leftover commented-out ResilienceConfi…
May 31, 2026
f020466
docs(license): add Apache-2.0 LICENSE to contract/ subdirectory
May 31, 2026
aa8508e
docs(license): add NOTICE to contract/ subdirectory
May 31, 2026
2bcbdf9
docs(license): add Apache-2.0 LICENSE and NOTICE to workflow-core pac…
May 31, 2026
fd26ed4
chore(workflow-core): switch package license to Apache-2.0
May 31, 2026
c17d8a7
docs(workflow-core): add package README
May 31, 2026
17ceb83
docs(readme): document two-tier license model in license section
May 31, 2026
2cc93a1
docs(notice): reference Apache subdirectory NOTICEs from top-level
May 31, 2026
ec925bf
docs(contributing): clarify which license contributions fall under
May 31, 2026
d058b23
docs(license): add AGPL-3.0 LICENSE and NOTICE to workflow-builder pa…
May 31, 2026
72833ae
chore(workflow-builder): set license field to AGPL-3.0-only in packag…
May 31, 2026
ee5dc27
docs(third-party-notices): document two-tier license model in intro
May 31, 2026
ed3d32e
docs(pr-template): reflect two-tier license in CLA checkbox
May 31, 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
36 changes: 36 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# EditorConfig — https://editorconfig.org
# Top-level config; no parent lookups beyond this file.
root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true

# Go uses tabs (gofmt is non-negotiable).
[*.go]
indent_style = tab

# TS / JS / JSON — 2-space (matches Prettier + tsconfig conventions).
[*.{ts,tsx,js,jsx,mjs,cjs,json,jsonc}]
indent_style = space
indent_size = 2

# YAML — 2-space (contract/*.yaml, GitHub Actions).
[*.{yml,yaml}]
indent_style = space
indent_size = 2

# Markdown — preserve trailing spaces (two-space line-break trick).
[*.md]
trim_trailing_whitespace = false

# Makefiles require literal tabs.
[Makefile]
indent_style = tab

[**/Makefile]
indent_style = tab
31 changes: 31 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# CODEOWNERS — Review routing for edge-agents
#
# Syntax: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
# Order matters: the LAST matching pattern wins for a given file.
#
# NOTE: The @ForestHubAI/maintainers team must exist in the GitHub org
# (Org Settings → Teams) for these mentions to resolve. Without the team,
# GitHub will show "Unknown owner" warnings on the Branch protection /
# PR review UI but CODEOWNERS routing will silently no-op.

# ---------------------------------------------------------------------------
# Default owner — applies to anything not covered by a more specific rule below
# ---------------------------------------------------------------------------
* @ForestHubAI/maintainers

# ---------------------------------------------------------------------------
# Language subtrees
# ---------------------------------------------------------------------------
/go/ @ForestHubAI/maintainers
/ts/ @ForestHubAI/maintainers

# ---------------------------------------------------------------------------
# Contract subtree — CRITICAL: this is the source of truth. Drift between
# go/ and ts/ codegen from the OpenAPI 3.0.3 contracts must always be reviewed.
# ---------------------------------------------------------------------------
/contract/ @ForestHubAI/maintainers

# ---------------------------------------------------------------------------
# Repo meta: CI workflows, issue templates, CODEOWNERS itself
# ---------------------------------------------------------------------------
/.github/ @ForestHubAI/maintainers
26 changes: 21 additions & 5 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,14 @@ Use clear, prefixed messages: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`.

## License and Contributor Agreement

edge-agents is dual-licensed: the public release is distributed under
[AGPL-3.0](../LICENSE), and ForestHub offers separate commercial licenses for use
cases that are incompatible with the AGPL (commercial licensing: root@foresthub.ai).
To keep this model viable, every contribution must grant ForestHub the rights needed
to offer it under both license regimes.
edge-agents uses a **two-tier license model**: the `contract/` and
`ts/workflow-core/` subdirectories are released under [Apache-2.0](../contract/LICENSE),
and all other components (engine, LLM proxy, workflow-builder, app) are released
under [AGPL-3.0](../LICENSE) with the option for ForestHub to also offer them under a
separate commercial license for use cases that are incompatible with the AGPL
(commercial licensing: root@foresthub.ai). To keep this model viable, every
contribution must grant ForestHub the rights needed to offer it under both license
regimes.

**By submitting a contribution (pull request, patch, or any other code or
documentation change), you agree to the following terms:**
Expand Down Expand Up @@ -153,3 +156,16 @@ including for presently unknown forms of use to the extent allowed by §31a UrhG
You confirm these terms by checking the Contributor License Agreement boxes in the pull
request template when you open your PR. A maintainer verifies this before merging; a PR
whose CLA boxes are not checked will not be merged.

### Which license your contribution falls under

The repository uses a two-tier license model:

- Contributions to `contract/` and `ts/workflow-core/` are released under
**Apache-2.0**.
- Contributions to all other paths (engine, LLM proxy, workflow-builder, app) are
released under **AGPL-3.0-only** with the option for ForestHub to also offer them
under a commercial license (per the CLA above).

If your PR touches both tiers, the per-file license header (or, where absent, the
directory-level `LICENSE`/`NOTICE`) governs.
18 changes: 18 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# GitHub Sponsors and other funding platforms for this repository.
# Reference: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository

github: ForestHubAI

# Additional platforms (uncomment to enable later):
# patreon: # Replace with a single Patreon username
# open_collective: # Replace with a single Open Collective username
# ko_fi: # Replace with a single Ko-fi username
# tidelift: # Replace with a single Tidelift platform-name/package-name
# community_bridge: # Replace with a single Community Bridge project-name
# liberapay: # Replace with a single Liberapay username
# issuehunt: # Replace with a single IssueHunt username
# lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name
# polar: # Replace with a single Polar username
# buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
# thanks_dev: # Replace with a single thanks.dev username
# custom: # Replace with up to 4 custom sponsorship URLs
31 changes: 31 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Issue-template chooser config.
# Reference: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository
#
# Forces contributors to pick a structured template (bug_report / feature_request)
# instead of opening blank issues. The contact_links route off-topic intents
# (questions, security reports, commercial inquiries) to the right channel so
# the issue tracker stays focused on actionable engineering work.

blank_issues_enabled: false

contact_links:
- name: Question / Discussion
url: https://github.com/ForestHubAI/edge-agents/discussions
about: |
Have a question, an idea, or want to discuss usage? Please open a
GitHub Discussion instead of an issue. (If Discussions is not yet
enabled on this repo, this link will 404 until the maintainer turns
it on in Settings → Features.)

- name: Security Vulnerability
url: https://github.com/ForestHubAI/edge-agents/security/advisories/new
about: |
Please do NOT open a public issue for security vulnerabilities. Use
GitHub's private vulnerability reporting, or email root@foresthub.ai.
See .github/SECURITY.md for scope and process.

- name: Commercial License Inquiry
url: mailto:root@foresthub.ai
about: |
edge-agents is dual-licensed (AGPL-3.0-only + commercial). For use
cases that are incompatible with AGPL, contact root@foresthub.ai.
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@

## Contributor License Agreement

- [ ] I agree to the terms in [CONTRIBUTING.md § License and Contributor Agreement](./CONTRIBUTING.md#license-and-contributor-agreement), including ForestHub's right to relicense my contribution commercially in addition to AGPL-3.0.
- [ ] I agree to the terms in [CONTRIBUTING.md § License and Contributor Agreement](./CONTRIBUTING.md#license-and-contributor-agreement). I understand that contributions to `contract/` and `ts/workflow-core/` are released under Apache-2.0, and contributions to all other paths are released under AGPL-3.0-only with ForestHub's right to also offer them under a commercial license.
- [ ] My contribution is my own original work and I am legally entitled to submit it under these terms.
- [ ] This contribution was created **outside** any employment, work-for-hire, or contractor obligations and **without** the use of employer-owned equipment, accounts, or time — **OR** my employer has explicitly authorized me to submit it under these terms and has waived any rights under §69b UrhG (or equivalent foreign law) for this contribution.
70 changes: 70 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
version: 2

updates:
# Go module (root of Go code is /go)
- package-ecosystem: "gomod"
directory: "/go"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "chore"
prefix-development: "chore"
include: "scope"
groups:
go-minor-and-patch:
applies-to: version-updates
update-types:
- "minor"
- "patch"
go-security:
applies-to: security-updates
update-types:
- "minor"
- "patch"

# npm workspace root (handles workflow-core, workflow-builder, app)
- package-ecosystem: "npm"
directory: "/ts"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "chore"
prefix-development: "chore"
include: "scope"
groups:
npm-minor-and-patch:
applies-to: version-updates
update-types:
- "minor"
- "patch"
npm-security:
applies-to: security-updates
update-types:
- "minor"
- "patch"

# GitHub Actions workflows
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "chore"
include: "scope"
groups:
actions-minor-and-patch:
applies-to: version-updates
update-types:
- "minor"
- "patch"
actions-security:
applies-to: security-updates
update-types:
- "minor"
- "patch"
51 changes: 51 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: CodeQL

on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
# Weekly on Sundays at 04:17 UTC. Off-peak, off the hour.
- cron: "17 4 * * 0"

permissions:
contents: read
actions: read
security-events: write

jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
# CodeQL's modern "javascript-typescript" identifier covers ts/.
# "go" covers go/ — autobuild finds the module via go/go.mod.
language: [go, javascript-typescript]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Go
if: matrix.language == 'go'
uses: actions/setup-go@v5
with:
go-version-file: go/go.mod
cache-dependency-path: go/go.sum

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-and-quality

- name: Autobuild
uses: github/codeql-action/autobuild@v3

- name: Perform CodeQL analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
29 changes: 29 additions & 0 deletions .github/workflows/gitleaks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: gitleaks

on:
push:
pull_request:

permissions:
contents: read
pull-requests: write

jobs:
scan:
name: Scan for leaked secrets
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout (full history)
uses: actions/checkout@v4
with:
# gitleaks needs the full history to scan past commits, not just
# the diff. Shallow clone would miss anything before the last fetch.
fetch-depth: 0

- name: Run gitleaks
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# No GITLEAKS_LICENSE on purpose: it's a paid-tier key. Public repos
# get full functionality on the free tier without it.
43 changes: 43 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Lint

on:
pull_request:
branches: [main]
push:
branches: [main]

permissions:
contents: read

jobs:
go-lint:
name: Go (golangci-lint)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go/go.mod
cache-dependency-path: go/go.sum
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: latest
working-directory: go
args: --timeout=5m

ts-lint:
name: TS (eslint)
runs-on: ubuntu-latest
defaults:
run:
working-directory: ts
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: ts/package-lock.json
- run: npm ci
- run: npm run lint
Loading
Loading