Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
263 commits
Select commit Hold shift + click to select a range
f51fc96
fix: resolve the default endpoint from the environment, clamp NaN flu…
naji247 Oct 17, 2026
dbfbbc3
test: validate request bodies against the API JSON schema
naji247 Oct 17, 2026
5144afb
fix: cap nesting at 512 in the normalizer and the last-resort clone
naji247 Oct 17, 2026
42fcc67
perf: make the last-resort truncation linear in the number of strings
naji247 Oct 17, 2026
c08c9e2
fix: skip NUL-prefixed keys so array casts of objects no longer drop …
naji247 Oct 17, 2026
bb23a05
fix: stringify non-exception errors like JSON.stringify
naji247 Oct 17, 2026
70a8046
fix: read injection failure messages through ErrorText
naji247 Oct 17, 2026
7acc7fd
test: keep the per-process test HOME under the git-ignored .cache dir
naji247 Oct 17, 2026
0fe4e15
fix: treat a NaN flush timeout as zero explicitly (max() returns NaN …
naji247 Oct 17, 2026
59adf80
test: replace expectExceptionMessage with a version-neutral Thrown he…
naji247 Oct 17, 2026
72a0931
build: add mcp/sdk as an optional adapter dependency with private-mem…
naji247 Oct 17, 2026
abebb7a
feat: add the public Options, Identity and ToolCall types
naji247 Oct 17, 2026
8235050
feat: add per-server tracking state and the tools/list step with rebu…
naji247 Oct 17, 2026
03ad3a2
feat: add deferred hooks, event publishing, client identity and HTTP …
naji247 Oct 17, 2026
bb15804
feat: add the library-neutral tools/call interceptor
naji247 Oct 17, 2026
8f119e3
fix: publish tool calls whose context argument is a list, with no intent
naji247 Oct 17, 2026
ddd2187
feat: inject AgentCat parameters into mcp/sdk tools/list answers
naji247 Oct 17, 2026
0e030fb
fix: step aside when the mcp/sdk handler list changes and keep the li…
naji247 Oct 17, 2026
3cc5a60
feat: track mcp/sdk tools/call with stripping, mint-back and the orig…
naji247 Oct 17, 2026
165f900
fix: share one container between AgentCat and mcp/sdk and record an e…
naji247 Oct 17, 2026
057ed7c
test: prove the container fallback autowires like the mcp/sdk default
naji247 Oct 17, 2026
39683a7
feat: add the AgentCat facade and Client with test mode and PSR-3 log…
naji247 Oct 17, 2026
250f529
fix: track a server once per process, keep Client autowirable and let…
naji247 Oct 17, 2026
31c792d
build: raise dev floors so the lowest dependency set passes PHPUnit a…
naji247 Oct 17, 2026
9107439
fix: keep the library's result types for ResponseEvent listeners
naji247 Oct 17, 2026
0fa7d39
fix: never fatal when ext-curl functions are missing or disabled
naji247 Oct 17, 2026
5f6f87c
fix: read the built state for the shape signals with warnings as exce…
naji247 Oct 17, 2026
a880bd9
fix: log the AgentCat SDK Compatibility lines as warnings
naji247 Oct 17, 2026
30f6f03
fix: warn about a tools/list answer without a tool list, like TypeScript
naji247 Oct 17, 2026
b3f9ff9
feat: record the owning client's publisher on each tracked server
naji247 Oct 17, 2026
1ea85ac
test: copy the git file list into the mcp/sdk main copy
naji247 Oct 17, 2026
860105a
test: call the simulated member drift uninitialized, as it is
naji247 Oct 17, 2026
9c87b2f
test: cover Options::fromArray with every option set
naji247 Oct 17, 2026
d3077da
refactor: drop the dead falsy check before validating eventTags
naji247 Oct 17, 2026
9b53e14
test: time the collection of a finished transfer from when it could h…
naji247 Oct 17, 2026
4317a4d
feat: add publishCustomEvent with TypeScript-parity server and sessio…
naji247 Oct 17, 2026
059b759
fix: log instead of throwing when publishCustomEvent cannot find a se…
naji247 Oct 17, 2026
6885277
test: pin the closure marker and the NAN substitution of a custom event
naji247 Oct 17, 2026
b52356a
feat: add AgentCat::fake() for customer test suites
naji247 Oct 17, 2026
953e26f
fix: count one PHPUnit assertion when a fake assertion passes
naji247 Oct 17, 2026
cc03b5c
feat: drain the event queue on SIGTERM and SIGINT in CLI servers
naji247 Oct 17, 2026
28b39a6
fix: forward siginfo, hand the signal back before the drain, and keep…
naji247 Oct 17, 2026
47ed2b5
test: prove tracking end to end over HTTP with a real mcp/sdk server
naji247 Oct 17, 2026
a71edbb
test: give the HTTP end-to-end test room on slow runners and keep its…
naji247 Oct 17, 2026
a27b9cd
test: prove tracking end to end over stdio, including EOF and SIGTERM…
naji247 Oct 17, 2026
e6b554e
fix: send no duration for a float outside the int range
naji247 Oct 17, 2026
bcaa4a1
fix: dispatch nothing in a shutdown after the shared deadline
naji247 Oct 17, 2026
9b4bebb
docs: say that the signal drain sees only an ignore set in PHP
naji247 Oct 17, 2026
38f362b
test: drop the ac-01-69 tag from the fake's test-mode tests
naji247 Oct 17, 2026
a4c381a
fix: keep AgentCat's log in the fake while a fake is the shared client
naji247 Oct 17, 2026
daf426f
fix: log instead of throwing for a server tracked while AgentCat was off
naji247 Oct 17, 2026
88d0b2c
test: pin the fake log's client registry and its string messages
naji247 Oct 17, 2026
5a72da5
feat: derive TypeScript trace, span and UUIDv7 IDs for exporters
naji247 Oct 17, 2026
28baa48
refactor: share the ext-curl check, POST options and curl error texts…
naji247 Oct 17, 2026
6aac54a
feat: add a non-blocking curl side channel for exporter and diagnosti…
naji247 Oct 17, 2026
927608f
fix: share one curl_multi engine and fail requests whose curl options…
naji247 Oct 17, 2026
0965bce
test: pin the first transfer step of start() and the handle removal a…
naji247 Oct 17, 2026
b726029
ci: give Infection a 120 s per-mutant timeout so no mutant is skipped
naji247 Oct 17, 2026
adc88c2
feat: let the event queue pump and drain exporter requests within its…
naji247 Oct 17, 2026
95abb7f
fix: keep the end of the shutdown budget for queue companions
naji247 Oct 17, 2026
077fa39
feat: add typed exporter configurations and the exporters, disableDia…
naji247 Oct 17, 2026
34bee7a
feat: build TypeScript-identical OTLP and Datadog export payloads
naji247 Oct 17, 2026
61387b2
feat: build TypeScript-identical Sentry envelopes and PostHog batches
naji247 Oct 17, 2026
201e3f9
fix: match JavaScript ASCII classes in the Sentry DSN pattern
Oct 17, 2026
144c2cc
feat: send events to OTLP, Datadog, Sentry and PostHog with TypeScrip…
naji247 Oct 17, 2026
9ae3aef
feat: set up exporters in track() first-wins with the TypeScript beacons
naji247 Oct 17, 2026
bd1810d
test: pin the default client's exporter setup and drop an unobservabl…
naji247 Oct 17, 2026
ab8c75d
feat: tee every SDK log line to AgentCat diagnostics with TypeScript …
naji247 Oct 18, 2026
7d5f92f
fix: keep diagnostics on hardened hosts and warn only when they started
naji247 Oct 18, 2026
b3ef409
feat: set diagnostics up in track() and flush them at the end of each…
naji247 Oct 18, 2026
3dcdb28
test: count the stdio diagnostics POSTs and tie each HTTP request to …
naji247 Oct 18, 2026
e9ef275
feat: add disableSignalHandlers to keep AgentCat's signal handlers ou…
Oct 18, 2026
b4b994d
fix: log the ignored disableSignalHandlers warning once per process
Oct 18, 2026
8007d41
fix: keep AgentCat's diagnostics requests out of flush()
naji247 Oct 18, 2026
c8a7609
fix: leave the side channel alone when a signal handler re-enters it
naji247 Oct 18, 2026
acc6ac3
fix: mask the user-info of an invalid Sentry DSN in its log line
naji247 Oct 18, 2026
39a866f
fix: read disableDiagnostics from config arrays like DISABLE_DIAGNOSTICS
naji247 Oct 18, 2026
60a6c9f
fix: log the full export queue once per pass, with the number dropped
naji247 Oct 18, 2026
9e29b3c
fix: cap the waiting side requests and the diagnostics buffer by bytes
naji247 Oct 18, 2026
922ec2c
docs: say exactly what diagnostics send in the disableDiagnostics PHPDoc
naji247 Oct 18, 2026
1a677c6
ci: stop the mutation job after 45 minutes
naji247 Oct 18, 2026
9100c29
fix: read the diagnostics variables with the AGENTCAT_ prefix
naji247 Oct 18, 2026
81e33b8
fix: treat a null disableDiagnostics as not set and say when it count…
naji247 Oct 18, 2026
d775c1d
fix: give diagnostics requests a 250 ms connect and 1 s total timeout
naji247 Oct 18, 2026
7871965
fix: let an off value of either diagnostics variable win
naji247 Oct 18, 2026
e760eeb
fix: keep the curl re-entrancy guard out of the event transport
naji247 Oct 18, 2026
b6c836b
fix: never nest a curl call in another call's arguments
naji247 Oct 18, 2026
1e68e77
feat: release the session, the time limit and the output buffers befo…
naji247 Oct 18, 2026
0a05768
fix: send the output buffers only when PHP ignores an aborted client
naji247 Oct 18, 2026
8a30b32
refactor: track servers through a registry of MCP libraries
naji247 Oct 18, 2026
55c2ac2
test: run the default output-buffer close in a PHP process, not over …
naji247 Oct 18, 2026
90a7070
build: add laravel/mcp as an optional adapter dependency with private…
naji247 Oct 18, 2026
47b97fd
feat: inject AgentCat's parameters into laravel/mcp tool listings
naji247 Oct 18, 2026
623bef2
feat: track laravel/mcp tool calls, their exceptions and their stream…
naji247 Oct 18, 2026
4bc9cf2
fix: share the once-per-object warning and keep customer and client e…
naji247 Oct 18, 2026
61ed20c
test: run one adapter conformance suite on mcp/sdk and laravel/mcp
naji247 Oct 18, 2026
401577c
test: tag the conformance validation scenario only with what it proves
naji247 Oct 18, 2026
13a6d64
fix: record the laravel/mcp request URL as sent and leave out the hea…
naji247 Oct 18, 2026
fcde847
feat: track every laravel/mcp server through an auto-discovered servi…
naji247 Oct 18, 2026
b3ea4bf
fix: let the cached Laravel configuration decide the project and the …
naji247 Oct 18, 2026
47d697b
feat: wait at most 1 s for delivery after each Laravel worker request
naji247 Oct 18, 2026
43ec642
fix: read Laravel's runningInConsole() by its truthiness in the reque…
naji247 Oct 18, 2026
2e418ed
feat: add agentcat:install to write the project ID into .env
naji247 Oct 18, 2026
e7d3363
fix: refuse an unreadable .env, keep export prefixes, and test consol…
naji247 Oct 18, 2026
01e757b
test: prove Laravel tracking end to end over HTTP and stdio
naji247 Oct 18, 2026
e92d93d
test: read a collector log that has no record yet as no requests
naji247 Oct 19, 2026
584a071
feat: give a tracked laravel/mcp answer its Content-Length where the …
naji247 Oct 19, 2026
88b3a3c
test: read only this request's setup line in the Laravel HTTP end-to-…
naji247 Oct 19, 2026
7777e31
fix: leave a laravel/mcp answer without Content-Length after stray ou…
naji247 Oct 19, 2026
f6bd433
fix: run the hooks of every waiting event before a flush returns, so …
naji247 Oct 19, 2026
632b4ec
fix: route every AgentCat environment name through config/agentcat.ph…
naji247 Oct 19, 2026
53873d4
feat: log the Laravel bridge's lines to storage/logs/agentcat.log by …
naji247 Oct 19, 2026
4d6fc08
fix: read the Laravel bridge's own keys with their types and log a ba…
naji247 Oct 19, 2026
bae996f
test: reset diagnostics before each cached-configuration test
naji247 Oct 19, 2026
7719339
fix: let the Laravel bridge's bool keys take the D44 words and name a…
naji247 Oct 19, 2026
4abb20e
fix: build laravel/mcp's CallTool through the container on a tracked …
naji247 Oct 19, 2026
70d1812
fix: keep a 0 s flush one non-blocking pass and bound each prepare pa…
naji247 Oct 19, 2026
995ad65
test: move ToolCalls to tests/Support so the Symfony test tools can r…
naji247 Oct 19, 2026
76e9077
build: add symfony/mcp-bundle as an optional dependency with a contra…
naji247 Oct 19, 2026
892f0f6
fix: bound each pump pass to the events queued at its start
naji247 Oct 19, 2026
1fa4398
feat: let a framework bridge give mcp/sdk calls their request context
naji247 Oct 19, 2026
4c0b2fa
fix: stop a pump or prepare pass when a signal drain empties the queu…
naji247 Oct 19, 2026
9d79855
test: name the no-context seam test after what it proves on the comma…
naji247 Oct 19, 2026
84eac83
refactor: move the bridge's typed key reads into core so the Symfony …
naji247 Oct 19, 2026
bffa8a1
build: raise the symfony/clock dev floor so an MCP request on the PHP…
naji247 Oct 19, 2026
719bd34
feat: track every symfony/mcp-bundle server through AgentCatBundle
naji247 Oct 19, 2026
7bfb568
test: give each test kernel its own container class so it never reads…
naji247 Oct 19, 2026
4f647cd
refactor: create the bundle's log directory with mkdir's default mode
naji247 Oct 19, 2026
a7f24d1
fix: leave out the X-Php-Ob-Level header that Symfony's HttpKernel ad…
naji247 Oct 19, 2026
36a1fc2
refactor: hand a bridge's agentcat configuration to the process in on…
naji247 Oct 19, 2026
d9ac197
test: share the handshake and tools/call params of the two HTTP harne…
naji247 Oct 19, 2026
cfab293
fix: read the bundle's environment-variable exclusions and service ID…
naji247 Oct 19, 2026
b0864fc
test: give each Laravel Content-Length test a maximum duration, as th…
naji247 Oct 19, 2026
707eb6b
feat: deliver Symfony events on kernel.terminate, waiting at most 1 s…
naji247 Oct 19, 2026
0352863
refactor: move the Laravel bridge's Content-Length rule into one core…
naji247 Oct 19, 2026
21e8927
fix: give no Content-Length to an answer without a body (1xx, 204, 304)
naji247 Oct 19, 2026
a3e8cb7
feat: give a tracked symfony/mcp-bundle server's JSON answers their C…
naji247 Oct 19, 2026
2ea8ec3
test: read a kernel event's listeners the same way on Symfony 7 and 8
naji247 Oct 19, 2026
b61e026
fix: give no Content-Length to an answer to a HEAD request
naji247 Oct 19, 2026
ca342a2
test: share the Symfony tests' AgentCat-on configuration, streaming k…
naji247 Oct 19, 2026
9bfc571
test: end each request of the Symfony customer test suites with the k…
naji247 Oct 19, 2026
0b54805
test: warm up one Laravel application and one Symfony kernel per proc…
naji247 Oct 19, 2026
b046791
test: fail a bridge test class when its warm-up meets a notice, warni…
naji247 Oct 19, 2026
7908029
test: run the adapter conformance suite on symfony/mcp-bundle
naji247 Oct 19, 2026
bec1348
feat: add the Symfony Flex recipe for AgentCatBundle
naji247 Oct 19, 2026
f524808
test: make the recipe test fail when the recipe YAML or the export-ig…
naji247 Oct 19, 2026
2edb597
test: add a Docker harness for runtime delivery tests
naji247 Oct 19, 2026
8cfaa25
test: build the Swoole image of the runtime tests with ext-pcntl
naji247 Oct 19, 2026
48749ff
test: fail the runtime tests when Docker does not answer, and run eve…
naji247 Oct 19, 2026
89cd48d
test: remove the runtime containers of dead test processes, and end e…
naji247 Oct 19, 2026
d675d1e
test: mount only the output directory, give PHP CLI images an init, a…
naji247 Oct 19, 2026
2c2dc38
test: cover FastCGI 4-byte lengths, parameters in several records and…
naji247 Oct 19, 2026
688749c
test: document which runtime images always get an init
naji247 Oct 19, 2026
17d107e
fix: post diagnostics once per request, at shutdown, in per-request r…
naji247 Oct 19, 2026
004cb2e
test: prove delivery after the response under PHP-FPM
naji247 Oct 19, 2026
88e1958
test: check that AgentCatBundle extends Bundle, which Symfony 8.1 doe…
naji247 Oct 20, 2026
bd79c8c
test: cover FrankenPHP worker mode, which keeps the 2 s diagnostics w…
naji247 Oct 20, 2026
cb65738
test: share one collector poll, the sent-event filter and the body ac…
naji247 Oct 20, 2026
0a13c05
test: prove FrankenPHP delivery in classic and worker mode
naji247 Oct 20, 2026
f84a075
test: bind FrankenPHP to 127.0.0.1 and prove the finish call on an an…
naji247 Oct 20, 2026
6ac7170
fix: end the answer with fastcgi_finish_request() under NGINX Unit
naji247 Oct 20, 2026
c7ef09c
test: prove CLI, Swoole, mod_php and NGINX Unit delivery in Docker
naji247 Oct 20, 2026
babcef3
test: pin the php -S server software on the output-buffer path
naji247 Oct 20, 2026
cb706a9
test: share the runtime delivery checks and read the Apache and Unit …
naji247 Oct 20, 2026
51ab339
fix: record the request of each call under AgentCat::fake() in the Sy…
naji247 Oct 20, 2026
e425236
fix: log instead of throwing for a custom event of a server that a br…
naji247 Oct 20, 2026
bd66ccd
fix: give the recipe's projects example a default for its variable
naji247 Oct 20, 2026
614d532
fix: move the bundle's addRequestHandlers call only in the shape it h…
naji247 Oct 20, 2026
9e64b1b
test: run AgentCatBundle in an application without symfony/mcp-bundle
naji247 Oct 20, 2026
d736aa8
test: pin the single argument of the bundle's addRequestHandlers call
naji247 Oct 20, 2026
1ac0127
test: send the events of a test without its own URL to a closed local…
naji247 Oct 20, 2026
7b76244
fix: type the bundle's configuration tree for symfony/config 7.3
naji247 Oct 20, 2026
94a3b55
test: run the mcp/sdk leg on the 0.9.0 tag
naji247 Oct 20, 2026
d92b881
fix: read every tools/list page, so no listed tool falls back to the …
naji247 Oct 20, 2026
9aacc26
fix: rebuild the registries for a get_more_tools call like for any ot…
naji247 Oct 20, 2026
b200372
fix: keep one output-registry entry for a nameless tool listed again
naji247 Oct 20, 2026
6c39108
test: assert the exact rebuild lines and cover the page-2 mirror and …
naji247 Oct 20, 2026
456696b
test: pin that the merged output registry stays a list
naji247 Oct 20, 2026
39d0658
fix: give the six remaining bundle keys an info text
naji247 Oct 20, 2026
9eed466
fix: treat an empty exclude string as unset with one log line
naji247 Oct 20, 2026
6d53ad2
fix: say when agentcat:install creates .env
naji247 Oct 20, 2026
a16d8f7
fix: tell publishCustomEvent callers what to pass instead of a Statel…
naji247 Oct 20, 2026
c73cc79
fix: let AGENTCAT_ENABLED decide when agentcat.enabled holds an unkno…
naji247 Oct 20, 2026
c82469a
fix: name the written key and the fix in the exporter entry and heade…
naji247 Oct 20, 2026
0fd1b6a
test: keep the provider docblock with its data provider
naji247 Oct 20, 2026
793d9a1
fix: treat a blank exclude string like an empty one
naji247 Oct 20, 2026
e3f9e4e
refactor: build the header message through invalid()
naji247 Oct 20, 2026
0c12454
refactor: state the accepted bool words once in the bundle
naji247 Oct 20, 2026
74a864b
test: assert every bool key states the accepted words
naji247 Oct 20, 2026
926d775
test: assert the full info text of the two remaining bool keys
naji247 Oct 20, 2026
320e64f
fix: keep serving on hosts that disable process, signal, curl multi a…
naji247 Oct 20, 2026
9a1993d
fix: log how to get the signal drain where it cannot install
naji247 Oct 20, 2026
f14121d
fix: log a failure that repeats on every delivery pass once, with its…
naji247 Oct 20, 2026
c650afa
test: disable posix_kill as well as posix_getpid on the signal path
naji247 Oct 20, 2026
22f55b6
test: serve an MCP session through a PHP-FPM pool that disables share…
naji247 Oct 20, 2026
63d105a
fix: count a repeated failure of the transport's own send and drain a…
naji247 Oct 20, 2026
309a442
ci: run every PHPStan configuration, the lowest set, a package probe …
naji247 Oct 20, 2026
292bfbd
ci: type the package probe for PHPStan, close the probe's proxy and c…
naji247 Oct 20, 2026
6c9d0ff
test: fail on src/ diagnostics that framework handlers hide
naji247 Oct 20, 2026
bccead0
test: make the finished-transfer bound robust
naji247 Oct 20, 2026
184ca90
test: make the positive-wait bound robust
naji247 Oct 20, 2026
c143b19
test: guard src/ diagnostics from the first provider boot and harden …
naji247 Oct 20, 2026
1e5a39d
ci: add the nightly upstream, runtime and release checks with one iss…
naji247 Oct 20, 2026
ebadab1
test: refresh the OpenAPI snapshot with the agentcat:custom event type
naji247 Oct 20, 2026
403de74
test: name the images of the containers in every failing runtime test
naji247 Oct 20, 2026
1f99782
ci: use the Swoole 6.2 line for latest, add step timeouts and a pull …
naji247 Oct 20, 2026
d1629d0
build: require agentcat/api 0.0.4, which lists the agentcat:custom ev…
naji247 Oct 20, 2026
eabc53e
test: snapshot every member of the library classes AgentCat touches, …
naji247 Oct 20, 2026
71729ed
test: compare unsnapshotted releases with the newest lower snapshot, …
naji247 Oct 20, 2026
a2037a3
test: trace every acceptance criterion to a test or a stated gap
naji247 Oct 20, 2026
350491d
test: read the snapshot script's arguments from $_SERVER, which PHPSt…
naji247 Oct 20, 2026
9febb34
fix: track() on the server a tracked Builder built returns it as alre…
naji247 Oct 20, 2026
def0d43
test: prove that track() names an unreadable server info, and keep th…
naji247 Oct 20, 2026
4a75720
test: count only group attributes, name each overlap, make async inte…
naji247 Oct 20, 2026
8671314
test: run the TypeScript e2e scenarios on the PHP lanes
naji247 Oct 20, 2026
4333430
test: refuse unknown scenario headers and non-local collectors, and a…
naji247 Oct 20, 2026
c65b8bd
test: prove the bridges under NGINX Unit and the Symfony mcp:server S…
naji247 Oct 20, 2026
d2d6d25
test: assert JSON-RPC on every stdout line and run the Unit cases in …
naji247 Oct 20, 2026
4ae8572
docs: give the README the TypeScript README's branding, with PHP quic…
naji247 Oct 20, 2026
c392836
docs: lead the Symfony quickstart with the manual setup, tighten the …
naji247 Oct 20, 2026
b909c46
ci: write the member snapshot's error output to the nightly report too
naji247 Oct 20, 2026
c4a6464
test: read the fixture's line from the output buffer first, which sta…
naji247 Oct 20, 2026
37129d5
docs: add the changelog, contributing guide, Composer metadata and La…
naji247 Oct 20, 2026
c7f8651
docs: make every comment state its rule or its reason
naji247 Oct 20, 2026
19655d6
test: guard every committed file in any case, and spell criteria as t…
naji247 Oct 21, 2026
3cc444d
test: check the PHP samples of a docs checkout
naji247 Oct 21, 2026
2fe7533
test: declare the application classes of the docs samples instead of …
naji247 Oct 21, 2026
34aeb51
docs: say how to remove the files that a killed runtime run leaves in…
naji247 Oct 21, 2026
b5df78f
fix: report versions without the v of a tag name
naji247 Oct 21, 2026
faf66d4
docs: state what 1.0.0 ships and promise no response time
naji247 Oct 21, 2026
3a7fba1
fix: name a whitespace-only exclude a blank string in its warning
naji247 Oct 21, 2026
8a2f681
fix: list no second get_more_tools after a page with the customer's own
naji247 Oct 21, 2026
8b2b105
test: read the installed versions as strings before their first letter
naji247 Oct 21, 2026
496384f
fix: end a delivery that cannot sleep instead of spinning to its dead…
naji247 Oct 21, 2026
5b1434e
test: install the package probe's release legs with stable dependenci…
naji247 Oct 21, 2026
33f8ddd
test: make the snapshot tests' directories under the test HOME
naji247 Oct 21, 2026
54dd95b
ci: name the failing tests in the nightly issues and keep PHP's messa…
naji247 Oct 21, 2026
a930438
ci: give every CI job a timeout of about three times its run time
naji247 Oct 21, 2026
2539ee7
refactor: decide the get_more_tools of a page from the server's recor…
naji247 Oct 21, 2026
0364cfe
ci: ignore the PHP 8.6 deprecation inside opis/json-schema with a bas…
naji247 Oct 21, 2026
d7479d1
ci: test the newest patch of each MCP library minor release from Pack…
naji247 Oct 22, 2026
cac764f
ci: run each package probe on the lowest PHP its mcp/sdk release allows
naji247 Oct 22, 2026
4f59e0e
Merge pull request #2 from agentcathq/feat/plan-b-pipeline
naji247 Oct 22, 2026
a5fc12f
Merge pull request #3 from agentcathq/feat/plan-c1-adapter
naji247 Oct 22, 2026
e8cdc7f
Merge pull request #4 from agentcathq/feat/plan-c2-public-api-and-e2e
naji247 Oct 22, 2026
3db70ce
Merge pull request #5 from agentcathq/feat/plan-d-exporters
naji247 Oct 22, 2026
eeee880
Merge pull request #6 from agentcathq/feat/plan-e1-laravel
naji247 Oct 22, 2026
763c657
Merge pull request #7 from agentcathq/feat/plan-e2-symfony-runtime
naji247 Oct 22, 2026
91e338c
Merge pull request #8 from agentcathq/feat/plan-f-release
naji247 Oct 22, 2026
108c361
Merge pull request #9 from agentcathq/feat/release-discovery
naji247 Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@
/.gitignore export-ignore
/.editorconfig export-ignore
/phpstan.neon.dist export-ignore
/phpstan.no-bundle.neon export-ignore
/.php-cs-fixer.dist.php export-ignore
/rector.php export-ignore
/phpunit.xml.dist export-ignore
/infection.json5 export-ignore
/docs export-ignore
/recipe export-ignore
/composer-dependency-analyser.php export-ignore
/phpstan.php85.neon export-ignore
/CONTRIBUTING.md export-ignore
/phpunit-baseline.xml export-ignore
20 changes: 20 additions & 0 deletions .github/nightly-issue.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Opens one issue per failing nightly job, or comments on the open one. A person closes it after the fix.
# Usage: nightly-issue.sh <job name> [report file]. The text of the report file, if it exists, goes into the issue or comment.
set -euo pipefail
job="$1"
title="Nightly: ${job} failed"
run_url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
gh label create nightly --color B60205 --description "A scheduled upstream or release check failed" 2>/dev/null || true
number="$(gh issue list --label nightly --state open --limit 100 --json number,title --jq ".[] | select(.title == \"${title}\") | .number" | head -n 1)"
body="The nightly job \`${job}\` failed: ${run_url}"
report="${2:-}"
if [ -n "${report}" ] && [ -s "${report}" ]; then
# An issue body holds at most 65536 characters.
body+=$'\n\n'"$(head -c 60000 "${report}")"
fi
if [ -n "${number}" ]; then
gh issue comment "${number}" --body "${body}"
else
gh issue create --title "${title}" --label nightly --body "${body}"
fi
160 changes: 157 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

# Each job's timeout-minutes is about three times its usual run time; GitHub's default is 6 hours.
jobs:
static:
name: Static analysis
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand All @@ -33,13 +35,33 @@ jobs:
- run: composer normalize --dry-run
- run: vendor/bin/php-cs-fixer check --diff
- run: vendor/bin/rector process --dry-run
- run: vendor/bin/phpstan analyse --no-progress --error-format=github
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G --configuration=phpstan.php85.neon
- run: vendor/bin/composer-dependency-analyser
- run: composer audit

static-lowest:
name: Static analysis (lowest dependencies)
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.5'
coverage: none
- uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
dependency-versions: lowest
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G --configuration=phpstan.php85.neon

tests:
name: Tests (PHP ${{ matrix.php }}, ${{ matrix.deps }})
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
Expand All @@ -61,6 +83,7 @@ jobs:
tests-next:
name: Tests (PHP 8.6, experimental)
runs-on: ubuntu-latest
timeout-minutes: 15
continue-on-error: true
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -73,11 +96,15 @@ jobs:
- uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
dependency-versions: highest
- run: vendor/bin/phpunit
# ergebnis/composer-normalize caps PHP below 8.6.
composer-options: --ignore-platform-req=php+
# The baseline holds the deprecations that PHP 8.6 raises inside a dependency (opis/json-schema).
- run: vendor/bin/phpunit --use-baseline phpunit-baseline.xml

coverage:
name: Coverage
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand Down Expand Up @@ -106,6 +133,8 @@ jobs:
mutation:
name: Mutation testing
runs-on: ubuntu-latest
# The full run takes about 8 minutes; a hanging mutant holds a thread for the 120 s Infection timeout.
timeout-minutes: 45
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand All @@ -130,11 +159,136 @@ jobs:
if: github.event_name != 'pull_request'
run: vendor/bin/infection --threads=max --logger-github

discover:
name: Discover the MCP library releases (Packagist)
runs-on: ubuntu-latest
timeout-minutes: 5
outputs:
releases: ${{ steps.releases.outputs.releases }}
mcp-sdk: ${{ steps.releases.outputs.mcp-sdk }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.5'
coverage: none
- uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
dependency-versions: highest
# The newest patch of each minor release from the require-dev floor, so a new release joins the matrix by itself.
- name: Read the releases from Packagist
id: releases
run: |
releases="$(php -d display_errors=stderr tests/bin/released-versions.php)"
jq -e 'type == "array" and length > 0' <<<"$releases" >/dev/null
echo "releases=${releases}" >>"$GITHUB_OUTPUT"
echo "mcp-sdk=$(jq -c 'map(select(.library == "mcp/sdk"))' <<<"$releases")" >>"$GITHUB_OUTPUT"
jq -r '.[] | "- \(.library) \(.version) (lowest PHP \(.php))"' <<<"$releases" >>"$GITHUB_STEP_SUMMARY"

released:
name: ${{ matrix.library }} ${{ matrix.version }} (PHP 8.5)
needs: discover
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.discover.outputs.releases) }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.5'
coverage: none
- uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
dependency-versions: highest
- name: Install ${{ matrix.library }} ${{ matrix.version }}
env:
LIBRARY: ${{ matrix.library }}
VERSION: ${{ matrix.version }}
run: tests/bin/require-library.sh "$LIBRARY" "$VERSION"
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G --configuration=${{ matrix.library == 'mcp/sdk' && 'phpstan.no-bundle.neon' || 'phpstan.neon.dist' }}
- run: vendor/bin/phpunit --testsuite Contract,Integration,E2E

runtime:
name: Runtime delivery (Docker, PHP 8.3)
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.3'
coverage: none
- uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
dependency-versions: highest
- name: Build the CLI and Swoole images and pull the others
run: |
docker build --tag agentcat-runtime-cli:8.3.35 tests/Runtime/docker
docker build --tag agentcat-runtime-swoole:6.2.3-php8.3 tests/Runtime/docker/swoole
for image in php:8.3.35-fpm-bookworm php:8.3.35-apache-bookworm dunglas/frankenphp:1.13.1-php8.3.35-bookworm unit:1.34.2-php8.3; do docker pull "$image"; done
- run: vendor/bin/phpunit --testsuite Runtime --group runtime
env:
AGENTCAT_RUNTIME_TESTS: '1'

package:
name: Package probe (PHP ${{ matrix.php }}, mcp/sdk ${{ matrix.version }})
needs: discover
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
# Each mcp/sdk release, on the lowest PHP that CI tests and the release allows (8.3 today).
include: ${{ fromJSON(needs.discover.outputs.mcp-sdk) }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: ${{ matrix.php }}
coverage: none
- name: Install the dist in a fresh project and track an mcp/sdk server
run: tests/bin/package-probe.sh "$MCP_SDK"
env:
MCP_SDK: ${{ matrix.version }}

bc:
name: Backward compatibility
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.3'
extensions: bcmath
coverage: none
- name: Compare with the latest 1.x tag
run: |
base="$(git tag --list 'v1.*' --sort=-v:refname | head -n 1)"
if [ -z "$base" ]; then echo "No v1.* tag yet: nothing to compare against (D63)."; exit 0; fi
composer global require --no-interaction roave/backward-compatibility-check:8.19.0
"$(composer global config bin-dir --absolute)/roave-backward-compatibility-check" --from="$base" --format=github-actions --install-development-dependencies

all-green:
name: All green
if: always()
needs: [static, tests, coverage, mutation]
needs: [static, static-lowest, tests, coverage, mutation, discover, released, runtime, package, bc]
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: re-actors/alls-green@b5b5b37504aa4183270bd3d855c52a67f212be35 # v1.3.0
with:
Expand Down
Loading
Loading