Commit Graph
17 Commits
Author SHA1 Message Date
0688faaec3 reland(sidecar): converge product clients on package boundary (#7636)
* reland(sidecar): converge product clients after weekly release

Restore the sidecar convergence from #7244 after the release-scheduling revert in #7634. This tree matches the previously reviewed and cross-platform QA-accepted implementation at d83d4e032f.

* fix(sidecar): clarify identity and cache witnesses

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(packaged): probe cross-source desktop owners

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): preserve cross-source launch ownership

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* test(pack): assert cross-source Windows launch ownership

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): align HyperFrames with client boundary

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(e2e): keep HyperFrames fixture in helper lane

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* docs(sidecar): restore review and handoff contracts

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): restore cache and daemon boundaries

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(pack): restore sourcemaps and Linux smoke discovery

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): make payload handoff generation-atomic

* fix(sidecar): preserve packaged action and mode parity

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* test(pack): align Linux cleanup resource count

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(packaged): preserve headless sidecar mode

* test: normalize source line endings

* fix(daemon): launch Codex cmd shims on Windows

---------

Co-authored-by: Looper <looper@noreply.github.com>
2026-09-01 13:22:04 +00:00
PerishFireandGitHub 5a62b0edad revert(sidecar): defer convergence until after weekly release (#7634)
Revert d83d4e032f to keep the current weekly release on its established baseline. The sidecar convergence work and QA acceptance remain valid and will be relanded after the release window closes.
2026-08-31 04:02:40 +00:00
d83d4e032f refactor(sidecar): converge product clients on package boundary (#7244)
* refactor(sidecar): own client identity and lifecycle atomics

* refactor(sidecar): converge product clients on package boundary

* fix(sidecar): use TypeScript process fixture

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(e2e): assert opaque sidecar capability

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): preserve resilient client handoffs

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(nix): build sidecar dependencies first

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): restore historical desktop handoff

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(packaged): canonicalize mac runtime paths

* fix(tools-pack): clean mac launcher namespace

* fix(sidecar): harden client lifecycle boundaries

* fix(sidecar): isolate concurrent lifecycle generations

* fix(sidecar): retain spawned process generations

* fix(sidecar): preserve resources across restart

* fix(tools-dev): retain dynamically bound daemon port

* fix(sidecar): fence Windows process generations

* test(packaged): use sidecar client in payload fixture

* fix(sidecar): enforce generation ownership

* fix(sidecar): persist generation ownership

* fix(sidecar): quick-fail ambiguous recovery

* fix(tools-pack): ship sidecar supervisor

* fix(sidecar): fence lifecycle generations

* fix(tools-pack): build platform before sidecar

* fix(sidecar): preserve nested stamped resources

* refactor(sidecar): model generation authority

* fix(sidecar): converge packaged build and headless actions

* fix(sidecar): isolate Windows generations

* fix(sidecar): retire orphaned generation descendants

* fix(sidecar): unify fenced process retirement

* fix(sidecar): converge contended launch generations

* test(sidecar): model slower packaged fixtures

* fix(sidecar): make supervisor the generation boundary

* fix(web): bound sidecar HTTP shutdown

* fix(pack): verify complete mac shutdown

* refactor(sidecar): converge packaged lifecycle sets

* fix(sidecar): serialize Windows packaged lifecycle

* fix(windows): harden packaged cold-start validation

---------

Co-authored-by: Looper <looper@noreply.github.com>
Co-authored-by: Amy <58060647+AmyShang-alt@users.noreply.github.com>
2026-08-31 03:27:41 +00:00
lorenzozaneandGitHub 54f9cd236a fix(web): answer /api paths with a connection failure when no daemon origin is configured (#7399)
When the web sidecar starts without OD_PORT, createDaemonProxyHandler
handed /api, /artifacts and /frames to the Next.js fallback, whose
catch-all answers every path with 200 text/html. Browser callers parsed
the shell as JSON and crashed with "Unexpected token '<'", and agent
detection quietly came back empty (#6074).

Daemon-routed pathnames now get the same plain-text ECONNREFUSED 502 the
proxy already synthesizes for a dead daemon, so
isDaemonProxyConnectionFailure recognizes the outage; non-daemon paths
keep falling through unchanged.
2026-08-26 10:23:26 +00:00
lefarcenandGitHub ad4f3609ca fix(collab): quell the packaged-client cloud 502 storm (heartbeat backoff, upstream error relay, proxy replay) (#6521)
* test(collab): red specs for the packaged-client presence/proxy 502 storm

Encode the three client-side halves of the 502 storm as failing specs on
main before any fix:

- web: a persistently failing presence upstream is heartbeated every 10s
  forever (62 POSTs in 10 minutes) with no backoff.
- daemon: every vela CLI presence failure is flattened into a 502 whose
  message embeds the spawned command line; upstream 403/404 rejections are
  indistinguishable from infra outages, every beat re-spawns the CLI, and
  presence spawns carry no timeout.
- web sidecar: an idempotent /api request that dies with a connection reset
  on a reused pooled daemon socket surfaces as a synthesized 502 instead of
  being replayed once on a fresh connection.

createDaemonProxyHandler is exported as the proxy spec's seam.

* fix(collab): stop the packaged-client presence/proxy 502 storm

Three client-side halves of one incident (hours of ~2050 DevTools errors:
POST /presence/heartbeat and PUT /workspace/billing/interests 502ing every
few seconds while the collab upstream rejected one project):

- web CollabClient: presence heartbeats move from a fixed 10s interval to a
  self-scheduling chain with exponential backoff on consecutive failures
  (10s -> 20s -> 40s -> ... capped at 5min, +/-10% jitter). One success or a
  new presence identity restores the base cadence, so recovery is untouched.

- daemon presence routes: vela CLI failures are classified via the CLI's
  'API request failed with status NNN' output. Upstream 401/403 relay as
  403, 404 as 404, timeouts as 503; only genuine infrastructure failures
  keep 502. Response bodies no longer embed the spawned command line or
  stderr (daemon log keeps the full detail). Repeated consecutive failures
  for one project open a 20s negative cache that answers without spawning
  another CLI process, and presence spawns now carry a 10s timeoutMs so a
  wedged CLI cannot pile up children.

- web sidecar proxy: proxied requests use an explicit keep-alive agent whose
  pooled idle sockets die well before the daemon's 120s keep-alive window,
  and an idempotent request with a small fully-buffered body that fails with
  ECONNRESET/EPIPE on a reused pooled socket before any response bytes is
  replayed once on a fresh connection instead of surfacing a synthesized 502
  the daemon never sent. Non-idempotent methods and large bodies keep the
  streaming path and are never replayed.
2026-08-06 18:47:07 +08:00
0bf1b6d6b8 [codex] converge release workflows and stable dry-runs (#4390)
* fix(tools-pack): use junctions for Windows standalone peer deps

* fix(desktop): expose IPC during startup

* fix(tools-pack): preserve Windows inspect diagnostics

* fix(tools-pack): report Windows inspect status errors

* fix(packaged): use Electron net fetch for app protocol

* fix(packaged): load Windows renderer from web sidecar

* fix(desktop): show Windows packaged window during startup

* fix(packaged): disable Windows GPU startup

* fix(tools-pack): keep Windows core smoke observable

* fix(packaged): remove Windows startup probes

* fix(tools-pack): trace Windows desktop IPC status

* fix(tools-pack): add Windows IPC diagnose loop

* fix(release): default beta-s Windows updater feed

* chore: clean merged test eof

* refactor(release): unify prerelease channel model

* chore(release): close prerelease doc escape hatches

* refactor(release): converge release channel workflows

* fix(release): install toolchain in metadata jobs

* fix(release): build release package before contracts

* chore(release): bump development version to 0.10.1

* fix(e2e): seed windows packaged smoke runtime config

* fix(release): install toolchain for metadata publish

* fix(release): materialize betas metadata checkout

* chore(release): bump development version to 0.10.2

* fix(release): allow betas metadata cold start from s3

* fix(e2e): support betas packaged update scenarios

* fix(release): pass betas channel into packaged smoke

* fix(release): set betas channel during self-hosted builds

* fix(release): verify counted channel reservations

* fix(release): use pnpm cmd for betas windows publish

* fix(release): add betas manifest artifact fallback

* fix(release): skip beta-s public metadata fetch

* fix(release): read beta-s manifests from storage

* fix(release): cache beta windows tools-pack builds

* fix(release): inline beta mac tools-pack builds

* fix(pack): deep sign unsigned mac bundles

* docs(pack): document payload-first beta updater validation

* fix(release): align preview tools-pack cache flow

* fix(release): align prerelease tools-pack cache flow

* fix(release): pass github token to prerelease metadata

* fix(release): setup pnpm before feishu notify

* fix(release): add stable dry-run prepublish flow

* fix(release): accept completed prerelease metadata gate

* fix(release): require stable release branches

* fix(release): converge r2 access checks

* fix(updater): use release channel parser for defaults

* fix(updater): harden windows payload relaunch

* fix(release): converge updater smoke fixture contract

* test(e2e): require silent updater fixture output

* fix(release): align stable windows smoke build path

* fix(ci): include release workspace in validation

* fix(ci): repair release validation lanes

Generated-By: looper 0.9.10+codex.autoclean (runner=fixer, agent=codex)

* fix(ci): restore zero-install Feishu notification

Generated-By: looper 0.9.10+codex.autoclean (runner=fixer, agent=codex)

---------

Co-authored-by: Looper <looper@noreply.github.com>
2026-06-23 06:13:21 +00:00
b6abbb1c73 fix(web): relax standalone readiness probe (#3811)
* fix(web): relax standalone readiness probe

* fix(web): guard standalone tcp readiness

---------

Co-authored-by: Lanzhou3 <217479610+Lanzhou3@users.noreply.github.com>
2026-06-15 09:33:42 +00:00
21e01f6a25 Fix raw asset review cards in design systems (#4093)
* fix: avoid raw asset review cards

* fix: resolve web component styles in dev

* fix: keep design system component images reviewable

* fix: use webpack for local web dev sidecar

* fix: improve design system review cards

* fix: render design system review previews from srcdoc

* fix: keep image ui kit cards generic

* fix: rebase inlined preview css urls

* test: allow slow send-now navigation

---------

Co-authored-by: Siri-Ray <2667192167@qq.com>
2026-06-11 15:37:02 +00:00
Zellux WangandGitHub 52b702648e Enable LAN web dev access (#1947) 2026-05-19 17:50:50 +08:00
PerishFireandGitHub cb92c93ae0 Migrate beta release publishing to R2 (#805)
* Prebundle standalone web packaged runtime

* Harden mac standalone prebundle policy

* Prebundle mac daemon packaged runtime

* Prune mac Electron locales

* Maximize mac release artifact compression

* Publish beta mac artifacts to R2

* Use remote R2 uploads for beta releases

* Fail fast on beta R2 access issues

* Use S3-compatible uploads for beta R2 releases

* Decouple beta versioning from GitHub releases

* Remove legacy beta metadata source

* Address release beta review notes
2026-05-07 19:13:52 +08:00
PerishFireandGitHub 3935aeb421 Optimize packaged mac artifact size (#424)
* optimize mac package payload reporting

* optimize(pack): package standalone web runtime

* optimize(pack): default to standalone web runtime

* chore(release): bump beta base version

* fix(pack): compress mac artifacts and report packaged version

* fix(pack): preserve Next server fallback

* fix(pack): clarify standalone startup failures

* fix(release): gate beta platform builds

* fix(web): bind standalone backend to parent

* fix(pack): harden standalone and beta publishing
2026-05-05 10:37:19 +08:00
lefarcenandGitHub a719f02aa2 fix(web): normalize daemon proxy origins
Fix web sidecar proxy requests so same-origin browser requests reach the daemon without tripping origin validation, while unrelated origins remain rejected. Fixes #388.
2026-05-04 03:39:19 +08:00
4510c69ba1 feat(tools-dev): add --prod flag and OD_HOST for headless server deployment (#222)
* feat(tools-dev): add --prod flag and OD_HOST for headless server deployment

- Lazy-load electronBinaryPath so daemon+web can start without Electron
- Add --prod flag to tools-dev start/run that sets NODE_ENV, OD_WEB_PROD,
  and OD_WEB_OUTPUT_MODE automatically for production Next.js builds
- Add OD_HOST env var support to daemon and web sidecar bind addresses
  (defaults to 127.0.0.1, set to 0.0.0.0 for remote access)
- Skip next.config.ts distDir override when OD_WEB_PROD=1 so production
  builds resolve the default .next directory

Closes #221

* fix: address PR review — hardcode daemon bind to 127.0.0.1, cache electron path

- Revert OD_HOST from daemon: daemon is a local privileged process and must
  only bind 127.0.0.1. Remote access goes through the web sidecar proxy.
- Web sidecar resolveDaemonOrigin now always uses 127.0.0.1, separated from
  the web bind address (OD_HOST) so the daemon proxy works correctly even
  when the web listener binds 0.0.0.0.
- Add OD_HOST character validation to reject clearly invalid values early.
- Cache electronBinaryPath getter result to avoid repeated require() calls.

---------

Co-authored-by: yamsfeer <yamsfeer@users.noreply.github.com>
2026-05-02 09:27:16 +08:00
PerishFireandGitHub a40d817d28 Add mac packaged runtime and beta release flow (#170)
* feat(pack): add mac packaged runtime control plane

* feat(pack): harden mac packaged runtime lifecycle

Keep packaged state namespace-scoped, make daemon paths explicit through sidecar launch env, and add conservative desktop identity/logging fallbacks for local mac package validation.

* feat(pack): add mac beta release flow

* fix(pack): generate mac update feed fallback

* fix(pack): write portable beta checksums

* fix(pack): make beta artifacts portable

* fix(pack): clean up mac install visuals

* fix(pack): address packaged runtime review feedback
2026-04-30 20:25:49 +08:00
3fb849d047 Fix chat runs surviving web disconnects (#146)
* fix chat runs surviving web disconnects

* fix chat run create abort propagation

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon keepalive reconnect budget

Generated-By: looper 0.0.0-dev (runner=fixer, agent=gpt-5.5)

* fix daemon stream disconnect cancellation

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon stream abort cancellation race

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon run cancellation semantics

* fix load

* doc

* 2

* add run refresh recovery

* fix active run refresh status

* fix reattach abort handling

* fix

* fix chat initial scroll

* fix daemon start failures

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix background run recovery

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix stop run status

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix background run recovery

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* extract daemon run service

* move prompt composition to daemon

* fix prompt module resolution

* fix project id generation

* add project run status

* add designs kanban view with awaiting_input status

- add grid/kanban view toggle on Designs tab; persist choice in localStorage
- introduce awaiting_input project display status (daemon-derived from
  unanswered <question-form>) so projects asking the user aren't shown
  as Completed; ordered between Running and Completed with amber accent
- hide transient queued state from users: coerce queued/starting to
  running in daemon /api/projects projection and drop the queued kanban
  column
- a11y polish on Designs cards: Space activation, aria-labels on delete,
  focus-visible outlines, reveal delete on focus-within and touch,
  prefers-reduced-motion handling
- kanban layout uses flex sizing instead of viewport math; scoped icon-
  only pill button rule fixes view-toggle icon alignment

---------

Co-authored-by: mrcfps <mrc@powerformer.com>
2026-04-30 20:16:46 +08:00
PerishFireandGitHub a19c866d5b Fix tools-dev default startup usability (#127)
Allow sidecar port zero for auto allocation and make lifecycle command output easier to read.
2026-04-30 14:50:44 +08:00
PerishFireandGitHub c6d11018a0 Refresh desktop integration control plane (#123)
* feat(dev): add desktop tools-dev control plane

* refactor(sidecar): split Open Design contracts

Move Open Design-specific sidecar protocol definitions into @open-design/contracts so sidecar and platform can remain descriptor-driven primitives.

* refactor(daemon): organize package sources

Keep daemon app code, tests, and sidecar entrypoints in separate package directories so each layer can be built and verified independently.

* chore(repo): streamline maintenance entrypoints

Centralize agent guidance by directory and reduce root command chains while preserving the existing build scope.

* docs: translate agent guidance to English

* fix(sidecar): tolerate stale IPC sockets

Remove stale Unix socket files only after confirming no listener is active, so tools-dev can restart after unclean shutdowns.
2026-04-30 14:23:53 +08:00