565 Commits

Author SHA1 Message Date
Miguel de Benito Delgado
13af3fb323 🚧 WIP 27, improve logging and console reporting.
AI-assisted-by: deepseek-flash, gpt-6.1-sol
2026-10-29 13:58:32 +01:00
Miguel de Benito Delgado
43b5e473cf 🚧 WIP 26, A/B tests and a bunch of fixes
AI-assisted-by: deepseek-flash, gpt-6.1-sol
2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
7ee69e3927 🚧 WIP 25.3 Cleanup: remove manual schema versioning, clean docstrings
AI-assisted-by: deepseek-flash, gpt-6.1-sol
2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
987fc38e6f 🚧 WIP 25.2 Safer deletion and symlink handling
AI-assisted-by: deepseek-flash, gpt-6.1-sol
2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
c14ca9e508 🚧 WIP 25.1 Cleanup.
More consistent args.
Avoid importing unnecessary namespaces.
Improve file write error handling.

AI-assisted-by: deepseek-flash, gpt-6.1-sol
2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
036236400d 🚧 WIP 25 complete runner, drop pilot
AI-assisted-by: deepseek-flash, gpt-6.1-sol
2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
adce3d2872 ✨ Add retained renderer benchmark builds and host
Add prepared build artifacts, browser host and the build and
purge commands for the CLJS renderer benchmarks.

Each preparation attempt gets a build ID and a retained directory with
its manifest, log, Node case catalog, browser bundle, renderer files
and host page. Ready builds load their matching catalog in process and
serve only their own directory through an owned loopback host.

Own Chromium through a bounded process group, verify the compiled build
identity before execution and retain failed preparations for diagnosis.
Wire the diagnostic pilot to the same build, catalog, server and
browser APIs.

Add real boundary tests for artifacts, processes, servers, browsers and
CLI parsing, and register them with the performance test runner. Rename
the benchmark lint and test scripts to match the suite.

AI-assisted-by: deepseek-flash
2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
36d696c345 🚧 WIP 24 Relocate all code, delete old benchmarks 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
35cd79cb03 🚧 WIP 23 Results and reporting. Cleanup 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
d5272e3179 🚧 WIP Step 22 nicer macros 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
693b0f5706 🚧 WIP Step 21.2 Cosmetic simplifications 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
fe99cd46d1 🚧 WIP Step 21.2 Docstrings 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
0338fead82 🚧 WIP Step 21.2 Docstrings 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
dc22e2d77f 🚧 WIP Step 21 Refactor namespaces 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
23746893e6 🚧 WIP Step 20 test last round of features 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
27e4597b45 🚧 WIP Step 19.2 Missing browser utils 2026-10-28 19:17:39 +01:00
Miguel de Benito Delgado
8140e751b8 🚧 WIP Step 19.1 Allow selecting cases in pilot 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
494abd17dd 🚧 WIP Step 19 New scenes, use camera 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
0eeba84af6 🚧 WIP Step 18 Camera ops 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
9cb53adb44 🚧 WIP Step 17 Support path construction 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
5ca9e06fa7 🚧 WIP Step 16.4 Refactor failures, remove legacy validation, cleanup 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
a76f225ba2 🚧 WIP Step 16.3 Cleanup pilot 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
54a4b70001 🚧 WIP Step 16.2 Renames and fixes 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
aa7bd111f8 🚧 WIP Step 16.1 Relax scene macro constraints 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
6cec9d7be4 🚧 WIP Step 16 Introduce hooks for the browser and load-scene 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
b01cdbe880 🚧 WIP Step 15.1, cosmetic 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
b982e864bd 🚧 WIP Step 15, Use transit to simplify validation 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
634b74d0c6 🚧 WIP Step 14, Grab correct w/h attrs from context 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
680408796a 🚧 WIP Step 13, Track failure causes
AI-assisted-by: muse-spark, GLM-5.3
2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
9356c3a225 🚧 WIP Step 12.4, Comments
AI-assisted-by: gpt6-astra
2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
5224a54cb7 🚧 WIP Step 12.3, Test cleanup + missing coverage
AI-assisted-by: muse-spark, deepseek-flash
2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
9f945de1a6 🚧 WIP Step 12.2, Fix browser bridge, lifecycle
AI-assisted-by: muse-spark, glm-5.3
2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
3b8b417045 🚧 WIP Step 12.1, Improve case validation
AI-assisted-by: muse-spark, glm-5.3
2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
9e5620600f 🚧 WIP Step 12, temporary pilot
- pilot runner for testing
- will be entirely removed later

AI-assisted-by: muse-spark-1.3, deepseek-flash, glm-5.3
2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
5afac4a330 🚧 WIP Step 11, browser bridge
- New schema:viewport
- Browser bridge (with some temp code)
- Move prepare-scene out measured regions
-
AI-assisted-by: muse-spark-1.3, deepseek-flash, glm-5.3
2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
4e9d83b4ad 🚧 WIP Step 10, scene upload 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
d46f5e59c6 🚧 WIP Step 10, defcase body validation, docs 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
8d04530e07 🚧 WIP Step 9, fix naming conventions 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
c16233f841 🚧 WIP Step 8, simplify and clean up tests 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
44dfb47c98 🚧 WIP Step 7, scene and case declarations 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
551c3bffb7 🚧 WIP Step 6, ellipses 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
bfde40d1ab 🚧 WIP Step 5, bools 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
bd17e6d431 🚧 WIP Step 4, frames and groups 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
9d281b225e 🚧 WIP Step 3, fixture macros, prng, defaults, placeholder scene 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
01f6eb2a7a 🚧 WIP Step 2, common scene code, validation 2026-10-28 19:17:38 +01:00
Miguel de Benito Delgado
50c72a1ad9 🚧 WIP Step 1, scaffold cljs benchmark runner 2026-10-28 19:17:38 +01:00
Dr. Dominik Jain
e20a0d748e
✨ Add OAuth support for MCP server (#12480)
* 🎉 Add OAuth support for remote MCP connections

Add MCP-specific discovery, client registration, and approval endpoints.
Exchange single-use authorization codes with PKCE for the fixed MCP user
token, enabling MCP and creating the token on approval when needed.

Use self-contained client IDs without new database tables or stored client
records. Keep temporary authorization state in Redis/Valkey.

Accept bearer credentials while preserving query-parameter connections.
Enable OAuth through PENPOT_MCP_AUTH_URI in multi-user mode. Document the
environment variable in the README and implementation details in Serena.

Explain protocol and concurrency decisions in the Clojure code. Cover token
provisioning, OAuth state, client registration, HTTP flows, and the approval
page with tests.

AI-assisted-by: gpt-6

* 🐛 Wait for devenv initialization before starting builds

Docker reports a container as Running as soon as its main process starts,
while the entrypoint may still be preparing the development environment.
manage.sh used that status to launch tmux jobs, allowing frontend builds
to race with ownership changes to /opt/rustup and Cargo setup.

On a fresh container, rustup could fail with Permission denied before the
frontend watcher started. Nginx would later serve the existing JavaScript,
leaving source changes absent from the running app despite restarting
devenv.

Wait for nginx's local health endpoint before launching the jobs. Nginx
starts after entrypoint setup, so its response confirms that setup has
finished. Allow up to 120 seconds and report a timeout without starting
the jobs if initialization does not complete.

Validation: shell syntax and whitespace checks pass.

AI-assisted-by: gpt-6

* ♻️ Share the login modal with MCP authorization

Extract the viewer login modal and its styles into a shared auth
component, retaining the viewer wrapper and its close behavior.

Use the modal on the MCP approval page and preserve the pending request
through login. Closing it clears the saved return URL and shows a
cancellation message without further actions.

Cover return URL handling and cancellation with frontend tests.

AI-assisted-by: gpt-6

* ✨ Show client icons in MCP authorization

Preserve HTTPS logo URLs from client registration and published metadata
and show the icon beside the application name on the approval page.
Ignore unusable URLs and hide failed images without blocking approval.

Update the access description to refer to MCP connections established
from Penpot. Cover logo metadata and approval responses in backend tests.

AI-assisted-by: gpt-6

* 🐛 Follow the system theme when no preference is configured

Default to the system theme in the shared resolver used by the app and
plugins. Preserve explicit light and dark choices, including the legacy
default value that means dark.

Reuse the reactive theme hook in progress widgets and show the system
preference in settings for accounts without a configured theme.

Verify preference resolution with regression tests and browser checks.
All 1,474 frontend tests pass.

AI-assisted-by: gpt-6

* 🐛 Replace expired MCP tokens during OAuth approval

Settings can give an MCP token an expiry date. OAuth approval reused
the newest MCP token without checking it, so an expired token reached
the client and never matched a plugin connection.

Approval now treats an expired token as missing and creates a new one.
Token exchange rejects a code whose token expired after approval with
invalid_grant.

AI-assisted-by: claude-opus-5-5

* 🐛 Log unexpected errors on MCP OAuth endpoints

The OAuth routes sit outside the shared HTTP middleware, so the shared
error handler never saw them, and their own handler turned unexpected
failures into a 503 without logging anything. Failures in the session
middleware of the approval endpoints had no handler at all.

Unexpected failures now also go through the shared error handler for
its logging, while clients still get an OAuth error body. The OAuth
error handler also wraps the session middleware of the approval
endpoints.

AI-assisted-by: claude-opus-5-5

* 🔧 Add devenv script to run the MCP server with OAuth

start-mcp-devenv-oauth starts the MCP server in multi-user mode with
PENPOT_MCP_AUTH_URI derived from PENPOT_PUBLIC_URI, to test OAuth in
the devenv. Agentic tooling still uses the single-user
start-mcp-devenv.

AI-assisted-by: claude-opus-5-5

* 🐛 Fix failing test case

---------

Co-authored-by: alonso.torres <alonso.torres@kaleidos.net>
2026-10-28 18:40:04 +01:00
Alejandro Alonso
4dc684dd9c Merge remote-tracking branch 'origin/staging' into develop 2026-10-28 11:50:56 +01:00
Pablo Alba
0532f15cee
🐛 Fix tab on variant name doesn't validate formula (#12655)
* 🐛 Fix tab on variant name doesn't validate formula

* ✨ Move helpers to common

* ✨ Mr proposed changes
2026-10-28 11:44:38 +01:00
Alejandro Alonso
a8e8a54a2b Merge remote-tracking branch 'origin/staging' into develop 2026-10-28 10:35:31 +01:00