Skip to content

Commit 2e31b14

Browse files
committed
Merge remote-tracking branch 'upstream/main' into chore/sync-upstream-v0.77.0
2 parents 860a52e + d085994 commit 2e31b14

428 files changed

Lines changed: 32287 additions & 6978 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.beads/issues.jsonl

Lines changed: 0 additions & 67 deletions
Large diffs are not rendered by default.

.dockerignore

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,15 @@ tests/
4141

4242
# Docs site — VitePress builds to gh-pages, not into the container
4343
docs/
44+
45+
# node_modules NEVER enter the build context — the web-builder stage runs a fresh
46+
# `npm ci` and the python runtime installs via pip, so a host's node_modules would
47+
# only bloat the context and risk leaking platform-specific binaries.
4448
node_modules/
45-
package.json
46-
package-lock.json
49+
# NOTE: package.json / package-lock.json are deliberately NOT excluded — the
50+
# web-builder stage COPYs them to run `npm ci` and build the React console
51+
# (apps/web/dist). Re-excluding them breaks that stage (the #874 console-never-
52+
# ships bug). They're harmless in the runtime image (Python ignores them).
4753

4854
# Seccomp profile — Docker reads this on the host at runtime
4955
# (via docker-compose security_opt), NOT from inside the image

.github/ISSUE_TEMPLATE/bug.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: Bug report
2+
description: Something is broken or behaves incorrectly.
3+
title: "bug: "
4+
labels: ["bug"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for filing. The required fields below map 1:1 to the issue gate
10+
(`.github/workflows/issue-gate.yml`) — fill them and the gate passes.
11+
See #1300 / #1310 for the house style.
12+
- type: textarea
13+
id: problem
14+
attributes:
15+
label: Problem / what's wrong
16+
description: What's broken, and where? Name the file / subsystem, and link the relevant ADR if any.
17+
placeholder: "`server/chat.py` does X every chunk but the contract says Y…"
18+
validations:
19+
required: true
20+
- type: textarea
21+
id: repro
22+
attributes:
23+
label: Steps to reproduce / evidence
24+
description: Minimal steps, logs, or a stack trace that demonstrate it.
25+
validations:
26+
required: true
27+
- type: textarea
28+
id: expected-actual
29+
attributes:
30+
label: Expected vs. actual
31+
description: What you expected to happen, and what actually happened.
32+
validations:
33+
required: true
34+
- type: textarea
35+
id: acceptance
36+
attributes:
37+
label: Acceptance
38+
description: How we'll know it's fixed — verifiable criteria.
39+
validations:
40+
required: true
41+
- type: input
42+
id: env
43+
attributes:
44+
label: Environment
45+
description: Instance (default/dev), OS, app vs. CLI, version / commit.
46+
validations:
47+
required: false
48+
- type: textarea
49+
id: refs
50+
attributes:
51+
label: Refs
52+
description: Related issues / PRs / ADRs (e.g. #1298, ADR 0047).
53+
validations:
54+
required: false

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Keep blank issues enabled: maintainers/agents may file intentional free-form
2+
# issues (tracking notes, quick split-outs). The gate flags those unless they
3+
# carry the `gate-exempt` label — see CONTRIBUTING.md.
4+
blank_issues_enabled: true
5+
contact_links:
6+
- name: Issue standard & contributing
7+
url: https://github.com/protoLabsAI/protoAgent/blob/main/CONTRIBUTING.md
8+
about: What a good issue needs (the same checks the silent gate runs) and how to clear the needs-info label.
9+
- name: Report a security vulnerability
10+
url: https://github.com/protoLabsAI/protoAgent/security/advisories/new
11+
about: Disclose vulnerabilities privately — do not open a public issue.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Enhancement / feature
2+
description: A new capability, or an improvement to an existing one.
3+
title: "feat: "
4+
labels: ["enhancement"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
The required fields below map 1:1 to the issue gate
10+
(`.github/workflows/issue-gate.yml`) — fill them and the gate passes.
11+
See #1159 for the house style.
12+
- type: textarea
13+
id: problem
14+
attributes:
15+
label: Problem / motivation
16+
description: What gap or pain motivates this? Who's affected, and where does it live today?
17+
validations:
18+
required: true
19+
- type: textarea
20+
id: proposal
21+
attributes:
22+
label: Proposed direction
23+
description: Sketch the approach. Multiple options are fine — note the trade-offs.
24+
validations:
25+
required: true
26+
- type: textarea
27+
id: acceptance
28+
attributes:
29+
label: Acceptance
30+
description: Verifiable criteria for "done".
31+
validations:
32+
required: true
33+
- type: textarea
34+
id: refs
35+
attributes:
36+
label: Refs
37+
description: Related issues / PRs / ADRs.
38+
validations:
39+
required: false

.github/workflows/checks.yml

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ jobs:
2020
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
2121
timeout-minutes: 5
2222
steps:
23-
- uses: actions/checkout@v4
24-
- uses: actions/setup-node@v4
23+
- uses: actions/checkout@v5
24+
- uses: actions/setup-node@v5
2525
with:
2626
node-version: "20"
2727
- name: Verify workspace config (.beads / .automaker / owned runners)
@@ -64,8 +64,8 @@ jobs:
6464
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
6565
timeout-minutes: 5
6666
steps:
67-
- uses: actions/checkout@v4
68-
- uses: actions/setup-python@v5
67+
- uses: actions/checkout@v5
68+
- uses: actions/setup-python@v6
6969
with:
7070
python-version: "3.12"
7171
- name: Ruff check
@@ -89,8 +89,8 @@ jobs:
8989
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
9090
timeout-minutes: 15
9191
steps:
92-
- uses: actions/checkout@v4
93-
- uses: actions/setup-python@v5
92+
- uses: actions/checkout@v5
93+
- uses: actions/setup-python@v6
9494
with:
9595
python-version: "3.12"
9696
cache: pip
@@ -107,13 +107,45 @@ jobs:
107107
. .venv/bin/activate
108108
python -m pytest tests/ -q
109109
110+
fleet-integration:
111+
name: Fleet integration (multi-instance)
112+
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
113+
# These tests boot real `python -m server` hub+member processes (against the
114+
# local scripts/fake_openai_server.py) on free loopback ports + tmp roots, so
115+
# they're much slower than the unit suite — allow ~10 min. Kept a SEPARATE job
116+
# from `tests` so its real-boot slowness never gates the fast unit run.
117+
timeout-minutes: 12
118+
steps:
119+
- uses: actions/checkout@v5
120+
- uses: actions/setup-python@v6
121+
with:
122+
python-version: "3.12"
123+
cache: pip
124+
- name: Install dependencies
125+
# Mirror the `tests` job: full requirements.txt in a venv so
126+
# tests/conftest.py's site.getsitepackages() reorder resolves (#175).
127+
run: |
128+
python -m venv .venv
129+
. .venv/bin/activate
130+
python -m pip install --upgrade pip
131+
pip install -r requirements.txt pytest pytest-asyncio
132+
- name: Boot real multi-instance fleet (hub + members) and exercise it
133+
# PA_RUN_INTEGRATION=1 flips on the real-subprocess harness the default
134+
# `pytest tests/` skips. Covers instance isolation, hub→member proxy
135+
# round-trip, cross-instance A2A delegation, and member crash→detect→restart
136+
# (POSIX zombie-reap — works on Linux). No network egress beyond loopback:
137+
# the fake gateway is local; mDNS advertise binds loopback only.
138+
run: |
139+
. .venv/bin/activate
140+
PA_RUN_INTEGRATION=1 python -m pytest tests/integration -q
141+
110142
live-smoke:
111143
name: A2A live smoke (lean tier)
112144
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
113145
timeout-minutes: 10
114146
steps:
115-
- uses: actions/checkout@v4
116-
- uses: actions/setup-python@v5
147+
- uses: actions/checkout@v5
148+
- uses: actions/setup-python@v6
117149
with:
118150
python-version: "3.12"
119151
cache: pip
@@ -139,8 +171,8 @@ jobs:
139171
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
140172
timeout-minutes: 10
141173
steps:
142-
- uses: actions/checkout@v4
143-
- uses: actions/setup-node@v4
174+
- uses: actions/checkout@v5
175+
- uses: actions/setup-node@v5
144176
with:
145177
node-version: "20"
146178
cache: npm
@@ -151,8 +183,37 @@ jobs:
151183
# the uiStore persist migration). Fast — runs before the heavier
152184
# Playwright path so a reducer regression fails the job early.
153185
run: npm run test:unit --workspace @protoagent/web
154-
- name: Install Playwright chromium
155-
run: npm --workspace @protoagent/web exec -- playwright install --with-deps chromium
186+
- name: Resolve Playwright version
187+
id: pw
188+
run: echo "version=$(node -p "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT"
189+
- name: Cache Playwright browsers
190+
id: pw-cache
191+
uses: actions/cache@v5
192+
with:
193+
path: ~/.cache/ms-playwright
194+
key: playwright-${{ runner.os }}-${{ steps.pw.outputs.version }}
195+
- name: Install Playwright browser + deps
196+
# The chromium binary is the slow ~100MB CDN download that intermittently
197+
# stalled ~10min until the job-level orphan-kill fired (#1167). Cache it keyed
198+
# on the Playwright version (skips the download entirely on a hit — only the
199+
# fast apt system-deps run then), and hard-cap each attempt with `timeout` so
200+
# a stalled download fails fast and retries instead of hanging the whole job.
201+
timeout-minutes: 8
202+
run: |
203+
if [ "${{ steps.pw-cache.outputs.cache-hit }}" = "true" ]; then
204+
cmd="playwright install-deps chromium" # binary cached → apt deps only
205+
else
206+
cmd="playwright install --with-deps chromium"
207+
fi
208+
for attempt in 1 2 3; do
209+
if timeout 240 npm --workspace @protoagent/web exec -- $cmd; then
210+
exit 0
211+
fi
212+
echo "::warning::playwright install attempt $attempt stalled/failed; retrying…"
213+
sleep 5
214+
done
215+
echo "::error::playwright install failed after 3 attempts"
216+
exit 1
156217
- name: Run E2E smoke (built SPA vs mock backend)
157218
# Builds the web app, then drives it with Playwright against the
158219
# deterministic mock backend (apps/web/e2e/mock-server.mjs) — no Python,

.github/workflows/desktop-build.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,17 @@ jobs:
8282
target: x86_64-pc-windows-msvc
8383
bundles: nsis
8484
steps:
85-
- uses: actions/checkout@v4
85+
- uses: actions/checkout@v5
8686
with:
8787
ref: ${{ inputs.tag || github.ref }}
8888

8989
- name: Setup Python
90-
uses: actions/setup-python@v5
90+
uses: actions/setup-python@v6
9191
with:
9292
python-version: '3.12'
9393

9494
- name: Setup Node
95-
uses: actions/setup-node@v4
95+
uses: actions/setup-node@v5
9696
with:
9797
node-version: '20'
9898

@@ -337,7 +337,7 @@ jobs:
337337
338338
- name: Upload dispatch artifact
339339
if: github.event_name == 'workflow_dispatch'
340-
uses: actions/upload-artifact@v4
340+
uses: actions/upload-artifact@v6
341341
with:
342342
name: protoAgent-${{ steps.version.outputs.version }}-${{ matrix.target }}
343343
path: dist-desktop/*
@@ -371,12 +371,12 @@ jobs:
371371
# in-app updater notes (below). By tag-push time CHANGELOG.md already holds the
372372
# dated `## [VERSION]` section — the bump PR (prepare-release.yml) merged before
373373
# the tag. Without this the job has no working tree (it only `gh release`s).
374-
- uses: actions/checkout@v4
374+
- uses: actions/checkout@v5
375375
with:
376376
ref: ${{ github.ref_name }}
377377

378378
- name: Setup Node
379-
uses: actions/setup-node@v4
379+
uses: actions/setup-node@v5
380380
with:
381381
node-version: '20'
382382

.github/workflows/docker-publish.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,21 @@ jobs:
3434

3535
steps:
3636
- name: Checkout
37-
uses: actions/checkout@v4
37+
uses: actions/checkout@v5
3838

3939
- name: Set up Docker Buildx
40-
uses: docker/setup-buildx-action@v3
40+
uses: docker/setup-buildx-action@v4
4141

4242
- name: Log in to GHCR
43-
uses: docker/login-action@v3
43+
uses: docker/login-action@v4
4444
with:
4545
registry: ${{ env.REGISTRY }}
4646
username: ${{ github.actor }}
4747
password: ${{ secrets.GITHUB_TOKEN }}
4848

4949
- name: Generate image metadata
5050
id: meta
51-
uses: docker/metadata-action@v5
51+
uses: docker/metadata-action@v6
5252
with:
5353
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
5454
tags: |
@@ -62,7 +62,7 @@ jobs:
6262
6363
- name: Build and push
6464
id: build
65-
uses: docker/build-push-action@v5
65+
uses: docker/build-push-action@v7
6666
with:
6767
context: .
6868
file: Dockerfile

.github/workflows/docs.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ jobs:
2626
build:
2727
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
2828
steps:
29-
- uses: actions/checkout@v4
30-
- uses: actions/setup-node@v4
29+
- uses: actions/checkout@v5
30+
- uses: actions/setup-node@v5
3131
with:
3232
node-version: 20
3333
cache: npm
3434
- run: npm install
3535
- run: npm run docs:build
36-
- uses: actions/upload-pages-artifact@v3
36+
- uses: actions/upload-pages-artifact@v5
3737
# Only needed to feed the deploy job — skip on PRs (build-only gate).
3838
if: github.event_name != 'pull_request'
3939
with:
@@ -49,4 +49,4 @@ jobs:
4949
url: ${{ steps.deployment.outputs.page_url }}
5050
steps:
5151
- id: deployment
52-
uses: actions/deploy-pages@v4
52+
uses: actions/deploy-pages@v5

0 commit comments

Comments
 (0)