Repository navigation
v3 - #4523
v3#4523
Conversation
9636bee to
f656b3a
Compare
47a5e0f to
8b586da
Compare
94607ff to
7fc6aa9
Compare
- Drop nil checks on injected services in auth, event, federated, registry, image update tags, and agent bootstrap - Drop the nil fallbacks in tag registry lookups, using the settings-driven digest timeout directly - Remove inline doc comments that restated the code, and tighten the remaining ones - Bump docker/compose/v5 to v5.7.0 with containerd v2.4.2 and go-winio v0.6.4 - Drop unused eiannone/keyboard and skratchdot/open-golang modules; add docker/secrets-engine as indirect deps
- Move buttons, inputs, selects, and tab pills to xl radii with lighter tinted badges - Add an underline tab variant for page-level tab bars - Shorten digests with a copy button and split port badges into host and container parts - Show stopped and exited containers as gray, not red - Add an optional segment bar to stat strip items
- Agents send hostname, OS, kernel, architecture, Docker and agent versions, CPUs, and memory when they register - Manager tracks tunnel RTT min/avg/max, bytes in/out, and stream counts - Manager keeps per-environment session count and last disconnect reason - Environment runtime state exposes agentHost and agentTunnelStats - Tunnel remote address honors trusted proxies via X-Forwarded-For
- Switch IsDiscovered, HasBuildDirective, RedeployDisabled, and EnvFileExists from omitempty to omitzero in types/project.go - Aligns the project flags with the json v2 zero-value convention used across types/
- Parse PROXY protocol headers on the HTTP listener when ARCANE_TRUSTED_PROXIES is set - Headers from trusted ranges set the client address; other peers are unchanged - Invalid trusted proxy ranges log a warning and disable PROXY protocol - Unwrap PROXY protocol connections in httpx so TCP deadline handling still applies
- Layout: fall back to cached or default version info when the version query fails - Layout: treat failed autologin queries as no config instead of throwing - Security: ignore cancelled query errors and default overview to null - Rename the registries page title to "Registries"
- Include the server timezone in job list responses, local and remote - Show the timezone in the environment automations schedule dialog - Log the timezone and UTC offset when the scheduler starts - Embed tzdata so named timezones load without system zoneinfo
- Wake tunnel waiters on registration instead of polling every 100ms - Pool 64 KiB copy buffers; flush only event streams and unknown-length responses - Reuse read buffers for tunnel and WebSocket frames - Stop forwarding the caller's Authorization, API key, and cookie to agents; only the agent token is sent - Add proxy and WebSocket frame benchmarks
- Add POST /api/environments/{id}/tunnel/restart, gated by environments:restart
- Add `arcane environments tunnel restart <id>` CLI command
- Add Restart Tunnel action on the environment detail page
- Record an environment.tunnel.restarted event
- Replace setup-go module caching with actions/cache in build and release workflows
- Compare run snapshots by maphash digest instead of retaining full JSON per run - Track pending activity sync per run and keep pending runs across mutations - Split coordinator "replace" into its own path that reads only the revision - Lower Postgres max idle connections from 15 to 4 - Grant environments:restart in RBAC migration 00102 (SQLite and Postgres)
- Load one coordinator record per job for run lists and job status instead of every record - Use lightweight summaries for repair and activity-sync passes instead of full coordinator state - Drop attempts and outcome targets on succeeded, skipped, and canceled runs beyond the 10 most recent detailed runs, keeping up to 50 retained - Exclude those compacted fields from activity digests so compaction does not trigger activity resync
- Drop the child process and its SIGTERM forwarding and exit-status relay - Set supplementary groups, GID, then UID in-process before exec - Set DOCKER_HOST, then syscall.Exec the same binary with the original args
- Use SvelteSet for expanded and selected rows in arcane-table and backup-file-picker - Replace manual grouping loops with Map.groupBy in arcane-table and port-badge - Remove snippet wrappers in gitops, backup policy, image search, and service editor dialogs - Split the API key page description into separate i18n keys so the link can be translated around
- Delete existing files through the workspace API immediately instead of queuing them until save - Keep pending renames, moves, and unsaved creates as local changes - Show a delete toast with the activity ID on success - Use plain Set, Map, and URL where Svelte reactivity is not needed - Update runtime identity spec expectations for PID 1 after exec
- Add an actions/cache step for ~/.local/share/pnpm/store before each Vite+ setup, keyed on runner OS, job, and pnpm-lock.yaml hash - Set cache: false on setup-vp in all jobs so the built-in cache does not overlap the explicit one
- Add optional GitHub token setting to raise the release notes API rate limit - Discover upstream GitHub repos when image labels are missing or point elsewhere - Match prefixed release tags (release-, app-) and find tags beyond the first page of releases - Use the image tag as the running version when no version label is set - Report GitHub rate limits with the reset time in logs - Change workspace delete confirmation to "This cannot be undone."
| const firstGroup = $derived(activityStore.runningGroups[0] ?? activityStore.historyGroups[0]); | ||
| const selectedKey = $derived(activityStore.focusedKey ?? (firstGroup ? activityGroupKey(firstGroup) : null)); |
There was a problem hiding this comment.
Selected activity output stays empty
Opening the inspector without an explicit selection now displays the first activity without calling activityStore.focus(). That call used to start loadDetailInternal(). ActivityDetailView only reads cached details, and incoming messages are ignored until that cache entry exists. An activity whose details have not been loaded therefore shows empty output even when it has logs, until the user clicks it.
Keep the derived selection, but also load details when the displayed key changes.
Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/lib/components/activity/activity-center-inspector.svelte
Line: 17-18
Comment:
**Selected activity output stays empty**
Opening the inspector without an explicit selection now displays the first activity without calling `activityStore.focus()`. That call used to start `loadDetailInternal()`. `ActivityDetailView` only reads cached details, and incoming messages are ignored until that cache entry exists. An activity whose details have not been loaded therefore shows empty output even when it has logs, until the user clicks it.
Keep the derived selection, but also load details when the displayed key changes.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.| const current = await upgradeJobStore.load(); | ||
| if (attempt !== startAttempt) return; | ||
| if (response.error !== null) { | ||
| handleStatusError(response.error); | ||
| if (isActiveUpgradeJob(current)) { | ||
| followJob(current); | ||
| return; | ||
| } | ||
| if (isActiveJob(response.data)) { | ||
| followJob(response.data); | ||
| } else { | ||
| phase = 'confirm'; | ||
| } | ||
| starting = false; |
There was a problem hiding this comment.
The dialog now adopts an existing job only during its first status request. If that request fails, or another tab starts an upgrade afterward, watch() still updates upgradeJobStore.job but nothing sets jobId. The dialog stays on the confirmation screen and hides progress and results until the user reopens it or confirms again.
Derive the displayed job from the live store until an explicit job has been selected, or adopt it when an update arrives.
Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/lib/components/dialogs/update-all-dialog.svelte
Line: 86-92
Comment:
**Running upgrades stay hidden**
The dialog now adopts an existing job only during its first status request. If that request fails, or another tab starts an upgrade afterward, `watch()` still updates `upgradeJobStore.job` but nothing sets `jobId`. The dialog stays on the confirmation screen and hides progress and results until the user reopens it or confirms again.
Derive the displayed job from the live store until an explicit job has been selected, or adopt it when an update arrives.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
Caution
This branch has breaking changes.
You can test it with the
getarcaneapp/manager:v3-betaandgetarcaneapp/agent:v3-betaimages, but beware you have been warned.Disclaimer Greptiles Reviews use AI, make sure to check over its work.
To better help train Greptile on our codebase, if the comment is useful and valid Like the comment, if its not helpful or invalid Dislike
To have Greptile Re-Review the changes, mention
greptileai.Fix the inspector's missing activity output before merging; the upgrade dialog also needs to adopt later job updates.
Fix with agent prompt
Summary
This v3 PR reorganizes the backend, shared types, agent connections, and frontend. The latest patch addresses all five numbered findings.
Reviews (2) · Last reviewed commit: "chore: cr" · Reviewed by Greptile