Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
628 commits
Select commit Hold shift + click to select a range
3a7d6ee
fix(collab): refresh shared-project title once the member pull lands …
lefarcen Jul 25, 2026
6d7eb36
fix(web): require confirmation before signing out (recvqgMWpJZqhL)
lefarcen Jul 25, 2026
39c010a
fix(templates): unbreak trading-analysis dashboard example preview (r…
lefarcen Jul 25, 2026
c94c62a
fix(web): balance composer model-mark spacing against its neighbors (…
lefarcen Jul 25, 2026
c21e4c3
fix(craft): extend CJK display leading floor to cover/hero titles
lefarcen Jul 25, 2026
bbe0c60
fix(daemon): stop the workspace-projects reconciler from FK-failing o…
lefarcen Jul 25, 2026
e208edc
fix(web): route personal-workspace upgrade CTAs to the wallet pricing…
lefarcen Jul 25, 2026
cb6b179
feat(daemon): pull shared-project content proactively on hub project-…
lefarcen Jul 25, 2026
13b923f
fix(web): align installed plugin details with 5517 demo
lefarcen Jul 25, 2026
efb10be
fix(web): mount updater dialog in app shell
lefarcen Jul 25, 2026
9cf9dd7
fix(collab): materialize first-time shared projects promptly
lefarcen Jul 25, 2026
b5e7f24
fix(collab): recover missed shared project content
lefarcen Jul 25, 2026
b0156c3
fix(collab): prioritize and recover shared project pulls
lefarcen Jul 25, 2026
d9ce0fa
fix(collab): retry flaky automatic pulls
lefarcen Jul 25, 2026
8250436
fix(collab): avoid pending state before status confirms lag
lefarcen Jul 25, 2026
f390125
fix(web): clear design system loader after workspace refresh
lefarcen Jul 25, 2026
0922ed1
fix(web): dedupe workspace project cards
lefarcen Jul 25, 2026
937cf86
fix(web): preserve chat pane grid transition
lefarcen Jul 25, 2026
fda4c27
fix(web): prioritize foreground project reopen requests
lefarcen Jul 25, 2026
2deb2d9
fix(daemon): enforce AMR first-output deadline
lefarcen Jul 25, 2026
6fcbba1
fix(web): preserve onboarding completion across config sync
lefarcen Jul 25, 2026
34da08b
fix(web): route invite actions by workspace capacity
lefarcen Jul 25, 2026
bc3c581
fix(web): open installed plugin cards in full-page detail
lefarcen Jul 26, 2026
b0586c0
fix(web): return plugin details to their source list
lefarcen Jul 26, 2026
c4ba322
perf(collab): overlap independent pull safety checks
lefarcen Jul 26, 2026
91580ff
feat(skills): import skills from remote URLs
lefarcen Jul 26, 2026
e2308b6
fix(web): align plugin share menu actions
lefarcen Jul 26, 2026
62803b1
fix(collab): retry first-share catalog propagation
lefarcen Jul 26, 2026
cd0fa8f
fix(collab): bound shared project pull transport
lefarcen Jul 26, 2026
93ca4f9
fix(web): restore tabs when returning to a workspace
lefarcen Jul 26, 2026
8109927
fix(collab): harden first-share pull recovery
lefarcen Jul 26, 2026
2723dd0
fix(collab): transfer provisional pull retries
lefarcen Jul 26, 2026
fbd8b05
fix(web): hide unauthorized workspace upgrade actions
lefarcen Jul 26, 2026
88953f0
fix(collab): prioritize targeted project recovery
lefarcen Jul 26, 2026
6ca7296
chore(collab): trace shared pull latency
lefarcen Jul 26, 2026
821f656
fix(collab): isolate targeted catalog recovery
lefarcen Jul 26, 2026
2567be2
fix(collab): batch durable pull cursors
lefarcen Jul 26, 2026
b71c868
fix(collab): reuse fresh pull authorization
lefarcen Jul 26, 2026
04a3c47
fix(collab): preserve mirror owner on restart
lefarcen Jul 26, 2026
91a3b3a
perf(collab): use exact project authorization
lefarcen Jul 26, 2026
90fab8f
perf(collab): prioritize live pulls over catch-up
lefarcen Jul 26, 2026
c873fea
fix(collab): make shared pulls transactional
lefarcen Jul 26, 2026
f0b5ef5
chore(pack): require authorized Vela pulls
lefarcen Jul 26, 2026
3fe300e
chore(nix): refresh pnpm dependency hashes
lefarcen Jul 26, 2026
363b9ff
fix(collab): tolerate transient workspace context gaps
lefarcen Jul 26, 2026
8d18db1
fix(web): prevent deck thumbnail overlap
lefarcen Jul 26, 2026
99d7417
fix(web): preserve files during shared project sync
lefarcen Jul 26, 2026
e16b1b7
fix(web): prioritize project opens over cover scans
lefarcen Jul 26, 2026
a4e5864
fix(web): keep personal team actions discoverable
lefarcen Jul 26, 2026
e82d94e
fix(web): gate team actions by capabilities
lefarcen Jul 26, 2026
16a5d26
test(web): cover paid personal invites
lefarcen Jul 26, 2026
ae37609
fix(web): keep empty workspace visible after chat collapse
lefarcen Jul 26, 2026
421910f
fix(web): keep workspace switcher actions visible
lefarcen Jul 26, 2026
36be22e
fix(extensions): import GitHub repository URLs
lefarcen Jul 26, 2026
519bba0
fix(desktop): read macOS mail handler domain
lefarcen Jul 26, 2026
4e0d3cc
fix(web): contain chat recovery actions
lefarcen Jul 26, 2026
a8aec4a
fix(billing): scope workspace balances explicitly
lefarcen Jul 26, 2026
bae03b2
chore(pack): upgrade Vela CLI test package
lefarcen Jul 26, 2026
b29f4e9
fix(billing): close workspace-scoped balance flows
lefarcen Jul 26, 2026
b052549
fix(billing): reject stale workspace context reads
lefarcen Jul 26, 2026
3284f36
fix(web): preserve workspace grid after chat collapse
lefarcen Jul 26, 2026
c597b59
fix(web): pin project panes to split tracks
lefarcen Jul 26, 2026
a5d3eaf
fix(web): label workspace balance as allowance
lefarcen Jul 26, 2026
d650b72
fix(workspace): classify invite conflicts safely
lefarcen Jul 26, 2026
0431ab9
fix: refresh workspace billing in real time
lefarcen Jul 26, 2026
ef4b67a
test(collab): cover transient workspace gap during pull
lefarcen Jul 26, 2026
9b77429
fix: bundle workspace billing snapshot CLI
lefarcen Jul 26, 2026
3de216e
perf(collab): bound broad project catch-up retries
lefarcen Jul 26, 2026
709c6c0
fix(collab): add missing-project recovery heartbeat
lefarcen Jul 26, 2026
4e08898
fix(collab): bound background head recovery
lefarcen Jul 26, 2026
0c97d9f
fix(billing): coordinate workspace-scoped runtime refresh
lefarcen Jul 26, 2026
496d379
fix(collab): keep team mirror promotion continuously readable
lefarcen Jul 26, 2026
150a3ea
fix(web): align skill marketplace detail with demo
lefarcen Jul 26, 2026
7653b83
fix(collab): avoid duplicate remote mirror pulls
lefarcen Jul 26, 2026
2ea858b
fix(web): preserve settled HTML previews on revisit
lefarcen Jul 27, 2026
5f13b75
fix(collab): return shared status before remote enrichment
lefarcen Jul 27, 2026
1d549a7
chore(pack): pin Vela CLI test.5
lefarcen Jul 27, 2026
173b589
fix(web): remove redundant drafts owner filter (#6045)
Siri-Ray Jul 27, 2026
3786980
fix(web): preserve mobile app page when entering edit (#6048)
Siri-Ray Jul 27, 2026
8ef167b
fix: pin project runs to persisted workspace scope
lefarcen Jul 27, 2026
25c35ae
test(web): narrow team workspace fixture
lefarcen Jul 27, 2026
7b4a719
fix(web): scope avatar wallet actions to projects
lefarcen Jul 27, 2026
21f452f
fix: fail closed on unresolved workspace authority
lefarcen Jul 27, 2026
39c4601
fix: bind AMR preflight and project creation atomically
lefarcen Jul 27, 2026
db15241
fix(web): shorten recharge recovery actions
lefarcen Jul 27, 2026
8abd663
fix(web): portal the invite role menu out of the scroll-clipped rows …
lefarcen Jul 27, 2026
2e25fd3
feat(collab): surface inbound project transfers
lefarcen Jul 27, 2026
0ed520c
fix(web): swap community and creation-page template detail modals
lefarcen Jul 27, 2026
db5d3a2
fix(billing): consume persistent revision clocks
lefarcen Jul 27, 2026
2fa4455
fix(collab): rescope hub events on workspace switch
lefarcen Jul 27, 2026
3a88c70
fix(billing): fail closed on unknown workspace access
lefarcen Jul 27, 2026
615d4c7
fix(billing): converge fenced revision epochs
lefarcen Jul 27, 2026
bb2712f
fix(billing): reject retired authoritative epochs
lefarcen Jul 27, 2026
dc895fa
fix(billing): scope runtime refreshes to active interests
lefarcen Jul 27, 2026
37faba7
fix(billing): coordinate scoped realtime interests
lefarcen Jul 27, 2026
e65b168
fix(billing): harden realtime snapshot authority
lefarcen Jul 27, 2026
429b59c
fix: bind imported projects to workspace transactions
lefarcen Jul 27, 2026
09697ed
chore(pack): pin Vela CLI 0.0.27-test.6
lefarcen Jul 27, 2026
3581455
fix(web): never adopt unowned tab snapshots across identity scopes
lefarcen Jul 27, 2026
2998025
fix(collab): judge team-project reconciliation by catalog membership,…
lefarcen Jul 27, 2026
bd249cc
fix(collab): never publish an unmaterialized shared-project placehold…
lefarcen Jul 27, 2026
a3040c9
fix(collab): coalesce cross-lane project pulls
lefarcen Jul 27, 2026
bede2fd
fix(collab): heal half-landed unshares so a retracted project cannot …
lefarcen Jul 27, 2026
9b011f2
perf(web): budget home thumbnail loading with viewport gating and cov…
lefarcen Jul 27, 2026
02587f0
perf(web): single-flight the duplicated project-open reads
lefarcen Jul 27, 2026
fc258b6
perf(web): skip the publish-public probe for readonly viewers
lefarcen Jul 27, 2026
f62271a
fix(daemon): let team members comment on shared projects they did not…
lefarcen Jul 27, 2026
5f34ae6
fix(daemon): stop a readonly member's version-history read from writing
lefarcen Jul 27, 2026
9955514
fix(web): disable the version-history entry for readonly shared projects
lefarcen Jul 27, 2026
3aaa5dd
fix(web): let a settled content update atomically replace the frozen …
lefarcen Jul 27, 2026
31b8d96
fix(daemon): restore a comment dirty mark when the targeted pull did …
lefarcen Jul 27, 2026
01c11d6
fix(web): render knowledge skill descriptions
lefarcen Jul 27, 2026
ccddd19
fix(web): preserve shared project titles on open
lefarcen Jul 27, 2026
f16e264
fix(web): keep plugin detail parsing browser-safe
lefarcen Jul 28, 2026
5238987
merge: sync origin/main (51 commits) into feat/workspace-team
lefarcen Jul 28, 2026
e69d1b2
merge: fold in feat/workspace-team commits pushed during the main syn…
lefarcen Jul 28, 2026
d3df717
chore(pack): pin Vela CLI 0.0.27-test.7
lefarcen Jul 28, 2026
71ff215
fix: skip redundant presence authorization lookup
lefarcen Jul 28, 2026
cbcd8c4
fix(web): portal the lightweight template preview above shell chrome
lefarcen Jul 28, 2026
9bbf433
merge: sync origin/main (desktop updater split) into feat/workspace-team
lefarcen Jul 28, 2026
abb7a95
chore: drop the stale main-merge working notes from the repo root
lefarcen Jul 28, 2026
da71561
fix(daemon): serve plugin markdown assets as text/markdown
lefarcen Jul 28, 2026
4460a3f
Fix design system asset resync before team share
lefarcen Jul 28, 2026
5ab6d98
fix(host): keep the host bridge independent of daemon/web contracts
lefarcen Jul 28, 2026
b381bd8
fix(desktop): keep importing the main entry side-effect-safe outside …
lefarcen Jul 28, 2026
6b95dbb
chore(nix): refresh the pnpm deps hashes for the current lockfile
lefarcen Jul 28, 2026
d8686e7
test(e2e): repoint the entry specs at the settings and plugins entrie…
lefarcen Jul 28, 2026
ee9793d
test(e2e): stop driving the pages dropdown the #5517 file view deleted
lefarcen Jul 28, 2026
28bc813
test(web): assert the onboarding ratchet the config sync now enforces
lefarcen Jul 28, 2026
5e4dedb
fix(host): drop the index signatures that broke the web production build
lefarcen Jul 28, 2026
e8ce637
fix(collab): stop a mis-shaped team-projects cache entry white-screen…
lefarcen Jul 28, 2026
e4fcf22
test(e2e): drive design files the way #5517 opens them
lefarcen Jul 28, 2026
df99df9
test(e2e): stop settingsSurface resolving to the account menu
lefarcen Jul 28, 2026
003991f
test(e2e): keep the Home plugin-use capture on Home
lefarcen Jul 28, 2026
e4f1e77
test(web): realign the workspace suites with the behavior they now de…
lefarcen Jul 28, 2026
5052731
fix(packaged): resolve the od:// proxy target per request
lefarcen Jul 28, 2026
797ef29
fix(daemon): only hold AMR to the workspace binding when workspace au…
lefarcen Jul 28, 2026
9c75c32
fix(web): match the chat slot's real hidden state, and drop the cut s…
lefarcen Jul 28, 2026
aa693ed
test(e2e): capture the plugin-use journey on the surface that still r…
lefarcen Jul 28, 2026
c4f7a1e
fix(web): scope plugin URL imports to workspace
lefarcen Jul 28, 2026
793d7b9
test(web): cover billing interest remount lifecycle
lefarcen Jul 28, 2026
319cb42
feat(packaged): enable the workspace-team transport for test-profile …
lefarcen Jul 28, 2026
7040264
test(daemon): cover billing catch-up after SSE reconnect
lefarcen Jul 28, 2026
925a4e0
fix(collab): surface and start first materialization when opening a s…
lefarcen Jul 28, 2026
8629e96
chore(packaged): inject the vela web origin at build time, not source
lefarcen Jul 28, 2026
4eb3de1
Merge chore/scrub-internal-origins into feat/workspace-team
lefarcen Jul 28, 2026
b9fea89
Merge fix/first-open-materializing-state into feat/workspace-team
lefarcen Jul 28, 2026
9a1f7ae
Merge origin/main into feat/workspace-team
lefarcen Jul 28, 2026
d3c1fad
test(e2e): follow the #5517 plugin-details route in the visual capture
lefarcen Jul 28, 2026
2bc2e7f
fix(packaged): restore masked CLI icons (#6154)
Siri-Ray Jul 28, 2026
ae36e56
Merge origin/main into feat/workspace-team
lefarcen Jul 28, 2026
02383b7
Merge remote-tracking branch 'origin/feat/workspace-team' into chore/…
lefarcen Jul 28, 2026
4e31617
Sync local workspace-team batch: UI polish, popover simplification, u…
wangchenglong0001 Jul 28, 2026
897b3f0
fix(web): restore design kit section spacing (#6155)
Siri-Ray Jul 28, 2026
9f818f9
fix(web): carry the plugin back to Home when Use runs from the detail…
lefarcen Jul 28, 2026
48ef489
Merge remote-tracking branch 'origin/feat/workspace-team' into chore/…
lefarcen Jul 28, 2026
5d618c0
test(e2e): open the nav rail before reaching for entry settings
lefarcen Jul 28, 2026
4b94a4d
Merge origin/main into feat/workspace-team
lefarcen Jul 28, 2026
f9b302b
test: realign the suites #6156 outpaced, and reach Settings from a pr…
lefarcen Jul 28, 2026
80c4e3e
Merge origin/main into feat/workspace-team
lefarcen Jul 28, 2026
a0986c8
test(e2e): finish the popover the settings chain opens on a project s…
lefarcen Jul 28, 2026
48f1846
test(e2e): pin the AMR selection assertion to the agent card
lefarcen Jul 28, 2026
6a897c4
test(e2e): prove Settings opened via its section nav, not a heading p…
lefarcen Jul 28, 2026
4ccfb5b
Merge origin/main (#6161) into feat/workspace-team
lefarcen Jul 28, 2026
7a8480e
test(web): retire the theme/appearance cases the product cut
lefarcen Jul 28, 2026
2d0ed53
test(e2e): realign the visual workspace captures with the narrowed su…
lefarcen Jul 28, 2026
568567b
test(e2e): give the AMR upgrade capture a billing-capable workspace
lefarcen Jul 28, 2026
6972561
test(e2e): leave projects through shipping chrome, and reach /project…
lefarcen Jul 28, 2026
3f6629b
fix manual edit across workspace pages (#6160)
Siri-Ray Jul 28, 2026
c2352b6
fix(collab): keep process-local presence alive when the collab transp…
lefarcen Jul 28, 2026
4f4a6a7
fix(web): scope desktop vibrancy to macOS (#6171)
Siri-Ray Jul 28, 2026
c0acc4b
fix(web): remove the theme setting and force every install back to li…
lefarcen Jul 28, 2026
1b14c1d
fix(web): make the update surfaces read real data (#6163)
lefarcen Jul 28, 2026
4a66531
test(e2e): unmask the AMR runtime lane and repair the visual settings…
lefarcen Jul 28, 2026
e22a289
Home shell productization batch: message center, What's-new on releas…
wangchenglong0001 Jul 28, 2026
dddb423
Converge the visual Design Files prelude instead of clicking once (#6…
lefarcen Jul 28, 2026
ea259eb
fix(web): explain the AMR workspace-scope block instead of a dead sen…
lefarcen Jul 28, 2026
52c73c5
test(updater): join the installer-reinstall floor across release and …
lefarcen Jul 28, 2026
0014262
fix(web): partition the workspace plan nameplate like the wallet (#6182)
lefarcen Jul 28, 2026
613cd51
Revert "fix(web): explain the AMR workspace-scope block instead of a …
lefarcen Jul 28, 2026
90dee94
fix(daemon): resolve an unbound project against the caller's current …
lefarcen Jul 28, 2026
a742a45
fix(web): point every console entry at /dashboard, drop the wallet ta…
lefarcen Jul 28, 2026
213bb2f
chore(release): bump feat/workspace-team to 0.16.2 (#6188)
lefarcen Jul 28, 2026
8858065
fix(collab): keep a project's "last changed" time out of sync's hands…
lefarcen Jul 28, 2026
bc3042f
fix(web): key every workspace read cache on who is asking (#6198)
lefarcen Jul 29, 2026
b74646c
fix(collab): carry B's workspace name for personal workspaces too (#6…
lefarcen Jul 29, 2026
47432c7
fix(web): stop offering 升级 at the top plan tier (team_max) (#6205)
lefarcen Jul 29, 2026
c27fa2d
fix(web): keep Send alive after using a community template (#6206)
lefarcen Jul 29, 2026
459fd98
fix(collab): give every created project a workspace home (#6201)
lefarcen Jul 29, 2026
20a8676
fix(web): move the update-ready rocket above the rail account row (#6…
lefarcen Jul 29, 2026
921e79b
fix(web): stop the home model list offering picks the chip cannot hon…
lefarcen Jul 29, 2026
738bde2
fix(collab): verify the asserted workspace before claiming an orphan …
lefarcen Jul 29, 2026
ac065a6
fix(web): use neutral Windows app background (#6218)
PerishCode Jul 29, 2026
59a2b45
fix(collab): let a headerless caller mutate its own daemon's project …
lefarcen Jul 29, 2026
9f4d0c4
fix(web): draw the team wordmark for every tier of a team plan (#6219)
lefarcen Jul 29, 2026
1b2e87e
fix(collab): warm the workspace-scoped digest faces on switch and rec…
lefarcen Jul 29, 2026
629bf8b
fix(daemon): split AMR workspace proof failure from proof refusal (#6…
lefarcen Jul 29, 2026
1c15574
fix(comments): preserve rejected mutations
lefarcen Jul 29, 2026
6414247
fix(comments): preserve partial send results
lefarcen Jul 29, 2026
f1c8ba8
fix(web): keep workspace-scoped data fresh across account and workspa…
lefarcen Jul 29, 2026
ca36ec6
feat(landing): publish current pricing snapshot
lefarcen Jul 29, 2026
b99f908
fix: durably deliver enterprise leads
lefarcen Jul 29, 2026
4f9a6a3
test(web): update ProjectView comment-status suites to the workspace-…
lefarcen Jul 29, 2026
8e3a892
fix(collab): make the local pin the only workspace-selection truth (#…
lefarcen Jul 29, 2026
ed8eaf8
fix landing pricing controls
lefarcen Jul 29, 2026
d4592d3
fix(daemon): resolve the AMR scope-telemetry app version in its own s…
lefarcen Jul 29, 2026
a1040fb
fix(web): isolate workspace identity snapshots
lefarcen Jul 29, 2026
7422482
test(e2e): move the server.ts identifier-scope guard into the merge g…
lefarcen Jul 29, 2026
c92bded
fix(collab): align unbound project mutation identity (#6231)
lefarcen Jul 29, 2026
4d39499
fix(web): guard workspace-scoped catalog reads (#6249)
lefarcen Jul 29, 2026
33fb229
fix(landing): show introductory team totals
lefarcen Jul 29, 2026
5a21418
fix(daemon): label critique with project skill (#6251)
lefarcen Jul 29, 2026
ce74c70
fix CI scopes across file renames (#6252)
lefarcen Jul 29, 2026
06094d6
fix(landing): make contact sales KV canonical
lefarcen Jul 30, 2026
391da2c
fix(web): preserve Cloud sign-in during outages (#6274)
lefarcen Jul 30, 2026
d8ff8ce
fix(collab): allow shared project viewer comments
lefarcen Jul 30, 2026
a5715da
fix(web): keep readonly comment creation available
lefarcen Jul 30, 2026
6801969
feat(web): personal/team project labels + collapse chat for shared no…
lefarcen Jul 31, 2026
e316efa
fix(web): stop narrow chat error cards stacking titles vertically (#6…
lefarcen Jul 31, 2026
68612c8
fix(workspace): make resource authority explicit (#6287)
lefarcen Jul 31, 2026
aa38aaa
UI polish batch: cloud sign-in, onboarding, composer menu (#6281)
wangchenglong0001 Aug 2, 2026
05275e8
fix(workspace): preserve scoped projects after main sync (#6320)
lefarcen Aug 2, 2026
be3a353
fix(workspace): seed dashboard workspace input
lefarcen Jul 31, 2026
6fa1ac8
test(workspace): cover live dashboard workspace input
lefarcen Aug 2, 2026
9e276e3
fix(workspace): backfill legacy workspace names
lefarcen Aug 2, 2026
3d2b733
Merge main 517f39ac into feat/workspace-team
lefarcen Aug 2, 2026
4f662dd
test(e2e): harden workspace collaboration coverage (#6312)
shangxinyu1 Aug 2, 2026
a2bef26
fix(workspace): refresh dashboard input on switch
lefarcen Aug 2, 2026
c1c20b7
Merge feat/workspace-team 4f662dd after main sync
lefarcen Aug 2, 2026
4e8bb47
fix(viewer): avoid inert attribute warning
lefarcen Aug 2, 2026
a902042
Merge workspace dashboard scope fix into main sync
lefarcen Aug 2, 2026
56e0c0b
Merge latest workspace viewer fix into main sync
lefarcen Aug 2, 2026
52b11a1
fix(chat): preserve user turn ordering
lefarcen Aug 2, 2026
7aa2f9e
chore(workspace): sync main through 517f39ac (#6346)
lefarcen Aug 2, 2026
4a4dfad
fix(workspace): stop retracted Team plugins immediately (#6335)
lefarcen Aug 2, 2026
722a1c8
fix(workspace): harden Vela billing proxy boundaries (#6348)
lefarcen Aug 3, 2026
caabd00
fix(web): tolerate unnamed workspace directory rows (#6349)
lefarcen Aug 3, 2026
74b2378
fix(workspace): enforce exact project-list scope
lefarcen Aug 3, 2026
1abbec7
merge feat/workspace-team into workspace project-list fix
lefarcen Aug 3, 2026
470f1cf
fix(workspace): show team design systems in pickers
lefarcen Aug 3, 2026
fd3fdb2
merge latest feat/workspace-team into project-list fix
lefarcen Aug 3, 2026
6ef98e4
fix(web): reserve image cards while thumbnails load
lefarcen Aug 3, 2026
e2fb99f
Merge remote-tracking branch 'origin/feat/workspace-team' into fix/de…
lefarcen Aug 3, 2026
6452a14
fix(web): keep home creation types ready during refresh
lefarcen Aug 3, 2026
49e45b2
test(e2e): align Windows beta smoke with installer
lefarcen Aug 3, 2026
c215fe6
perf(web): start team catalog from exact directory identity
lefarcen Aug 3, 2026
c3810a8
Merge origin/main into feat/workspace-team
lefarcen Aug 3, 2026
e719e52
fix(web): refresh revoked workspace context
lefarcen Aug 3, 2026
b7e0e08
fix(web): order collaboration presence refreshes
lefarcen Aug 3, 2026
bb091f3
fix(amr): prefer selected Vela OpenCode companion
lefarcen Aug 3, 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
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,8 @@ jobs:
handoff_dir="$(python3 .github/scripts/handoff.py dir comment "$handoff_id" --root "$handoff_root")"
mkdir -p "$handoff_dir"
marker="<!-- merge-queue-needs-validation -->"
# Markdown code spans are intentionally literal in these single-quoted strings.
# shellcheck disable=SC2016
{
printf '%s\n' "$marker"
# Markdown code spans are intentional literal text.
Expand Down
120 changes: 120 additions & 0 deletions .github/workflows/release-beta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ on:
required: false
type: string
default: ""
amr_profile:
description: "Optional AMR profile baked into the build (e.g. feature-test to point the packaged app at that profile's AMR backend and enable the workspace-team transport). Empty leaves the default (prod)."
required: false
type: string
default: ""
mac_arm64_sign_mode:
description: "macOS arm64 signing mode."
required: true
Expand Down Expand Up @@ -205,6 +210,10 @@ on:
required: false
type: string
default: ""
amr_profile:
required: false
type: string
default: ""
mac_arm64_sign_mode:
required: false
type: string
Expand Down Expand Up @@ -307,6 +316,20 @@ env:
POSTHOG_HOST: ${{ inputs.publish && vars.POSTHOG_HOST || '' }}
POSTHOG_CLI_API_KEY: ${{ inputs.publish && secrets.POSTHOG_CLI_API_KEY || '' }}
POSTHOG_CLI_PROJECT_ID: ${{ inputs.publish && vars.POSTHOG_CLI_PROJECT_ID || '' }}
# Vela web console origin for the AMR profile this build targets. Held in a
# per-profile repository secret instead of the source tree: the non-prod AMR
# environments are internal deployments and this repository is public, so
# neither the workflow nor the product code may name their hostnames.
#
# tools-pack bakes it into open-design-config.json and the packaged runtime
# forwards it to the daemon as OD_VELA_WEB_URL, which is the second half of the
# workspace-team gate (the first being the AMR profile allowlist). A profile
# whose secret is not configured therefore ships with workspace-team dormant
# rather than pointed at an unknown backend. `prod` never gets an origin — the
# packaged gate rejects it regardless.
#
# Secrets read here: VELA_WEB_URL_FEATURE_TEST, VELA_WEB_URL_TEST.
OD_VELA_WEB_URL: ${{ inputs.amr_profile == 'feature-test' && secrets.VELA_WEB_URL_FEATURE_TEST || inputs.amr_profile == 'test' && secrets.VELA_WEB_URL_TEST || '' }}
RELEASE_BRANCH: ${{ github.ref_name }}
RELEASE_REPOSITORY: ${{ github.repository }}
RELEASE_RUN_ATTEMPT: ${{ github.run_attempt }}
Expand Down Expand Up @@ -475,6 +498,13 @@ jobs:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
# Bake the AMR profile (tools-pack reads OPEN_DESIGN_AMR_PROFILE) so a
# feature-test dispatch produces a packaged app that targets that
# profile's AMR backend and enables the workspace-team transport. The
# matching console origin arrives via the workflow-level
# OD_VELA_WEB_URL. Empty = default (prod) — the normal beta pipeline is
# unaffected.
OPEN_DESIGN_AMR_PROFILE: ${{ inputs.amr_profile }}
run: |
set -euo pipefail
mkdir -p "$RUNNER_TEMP/release-build/mac_arm64"
Expand Down Expand Up @@ -508,6 +538,11 @@ jobs:

- name: Retry beta mac_arm64 without restored cache
if: ${{ steps.mac_arm64_tools_pack_build.outcome == 'failure' }}
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
OPEN_DESIGN_AMR_PROFILE: ${{ inputs.amr_profile }}
run: |
set -euo pipefail
rm -rf "$RUNNER_TEMP/tools-pack-cache"
Expand Down Expand Up @@ -540,6 +575,42 @@ jobs:
exit "$build_status"
fi

- name: Upload mac_arm64 DMG for manual distribution
# Only when NOT publishing to the release feed: this is the downloadable
# artifact for a manual dispatch (e.g. a signed feature-test build handed
# to teammates). The normal publish=true release pipeline is unchanged.
if: ${{ !cancelled() && !inputs.publish }}
uses: actions/upload-artifact@v7
with:
name: open-design-beta-mac-arm64-dmg
path: ${{ runner.temp }}/tools-pack/out/mac/namespaces/release-beta/**/*.dmg
if-no-files-found: warn
retention-days: 14

- name: Upload mac_arm64 dogfood build to release storage
# Companion to the artifact step above, for publish=false only. A GitHub
# artifact needs a logged-in teammate and a zip round-trip; this puts the
# same DMG in R2 under dogfood/<version>/<build>/ so the link can be
# handed over directly. It writes no channel metadata and no latest
# pointer (enforced by the guard in tools/release/src/storage/dogfood.ts),
# so it cannot change what an installed client sees as an available
# update. The publish=true pipeline is untouched.
if: ${{ !cancelled() && !inputs.publish }}
continue-on-error: true
env:
DOGFOOD_BUILD_ID: ${{ github.run_id }}-${{ github.run_attempt }}
DOGFOOD_BUILD_JSON_KEYS: dmgPath
DOGFOOD_BUILD_JSON_PATH: ${{ runner.temp }}/release-build/mac_arm64/build.json
DOGFOOD_LABEL: macOS arm64 beta ${{ needs.metadata.outputs.beta_version }}
DOGFOOD_VERSION: ${{ needs.metadata.outputs.beta_version }}
RELEASE_PUBLIC_ORIGIN: ${{ inputs.release_public_origin != '' && inputs.release_public_origin || vars.CLOUDFLARE_R2_RELEASES_PUBLIC_ORIGIN }}
RELEASE_STORAGE_ACCESS_KEY_ID: ${{ secrets.CLOUDFLARE_R2_RELEASES_AK }}
RELEASE_STORAGE_BUCKET: ${{ secrets.CLOUDFLARE_R2_RELEASES_BUCKET }}
RELEASE_STORAGE_ENDPOINT: ${{ secrets.CLOUDFLARE_R2_RELEASES_URL }}
RELEASE_STORAGE_REGION: auto
RELEASE_STORAGE_SECRET_ACCESS_KEY: ${{ secrets.CLOUDFLARE_R2_RELEASES_SK }}
run: pnpm exec tools-release publish-dogfood

- name: Delete failed mac_arm64 tools-pack cache
if: ${{ steps.mac_arm64_tools_pack_build.outcome == 'failure' && steps.mac_arm64_tools_pack_cache_restore.outputs.cache-matched-key != '' }}
continue-on-error: true
Expand Down Expand Up @@ -1054,6 +1125,14 @@ jobs:
OD_BETA_WINDOWS_SIGN_CERT_SHA1: ${{ steps.sign_probe.outputs.thumbprint }}
OD_PACKAGED_E2E_WIN_UPDATE_METADATA_URL: ${{ inputs.win_x64_update_metadata_url }}
OD_PACKAGED_E2E_WIN_UPDATE_VERSION: ${{ inputs.win_x64_update_target_version }}
# Bake the AMR profile (tools-pack reads OPEN_DESIGN_AMR_PROFILE) so a
# feature-test dispatch produces a packaged app that targets that
# profile's AMR backend and enables the workspace-team transport. Empty
# = default (prod) — the normal beta pipeline is unaffected. Mirrors the
# mac_arm64 build step above; this was missing here, so every win_x64
# dogfood build silently fell back to prod and could not sign in to a
# feature-test AMR environment.
OPEN_DESIGN_AMR_PROFILE: ${{ inputs.amr_profile }}
run: |
$ErrorActionPreference = "Stop"
New-Item -ItemType Directory -Force -Path "${{ runner.temp }}\release-build\win_x64" | Out-Null
Expand All @@ -1070,6 +1149,8 @@ jobs:
id: win_tools_pack_build_retry
if: ${{ steps.win_tools_pack_build.outcome == 'failure' }}
shell: pwsh
env:
OPEN_DESIGN_AMR_PROFILE: ${{ inputs.amr_profile }}
run: |
$ErrorActionPreference = "Stop"
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue "${{ runner.temp }}\tools-pack-cache"
Expand All @@ -1083,6 +1164,45 @@ jobs:
$build = $buildOutput | ConvertFrom-Json
pnpm.cmd exec tools-pack win validate-payload --namespace release-beta-win --payload-path $build.payloadPath --expected-version "${{ needs.metadata.outputs.beta_version }}" --json

- name: Upload win_x64 installer for manual distribution
# Only when NOT publishing to the release feed, mirroring the mac DMG
# step. Before this existed a publish=false dispatch left the Windows job
# with nothing retrievable at all, so a QA/dogfood build could not be
# handed to a teammate without also publishing to the public feed. The
# glob covers every win_x64_target: nsis produces the setup exe, zip the
# portable zip, all both. The normal publish=true pipeline is unchanged.
if: ${{ !cancelled() && !inputs.publish }}
uses: actions/upload-artifact@v7
with:
name: open-design-beta-win-x64-installer
path: |
${{ runner.temp }}\tools-pack\out\win\namespaces\release-beta-win\builder\*-setup.exe
${{ runner.temp }}\tools-pack\out\win\namespaces\release-beta-win\builder\*-portable.zip
if-no-files-found: warn
retention-days: 14

- name: Upload win_x64 dogfood build to release storage
# publish=false only. Artifact paths come from the build's own --json
# output rather than a hardcoded layout, so whichever of installerPath /
# portableZipPath the selected win_x64_target actually produced is what
# gets uploaded. Writes under dogfood/<version>/<build>/ and nowhere
# else; see the guard in tools/release/src/storage/dogfood.ts.
if: ${{ !cancelled() && !inputs.publish }}
continue-on-error: true
env:
DOGFOOD_BUILD_ID: ${{ github.run_id }}-${{ github.run_attempt }}
DOGFOOD_BUILD_JSON_KEYS: installerPath,portableZipPath
DOGFOOD_BUILD_JSON_PATH: ${{ runner.temp }}\release-build\win_x64\build.json
DOGFOOD_LABEL: Windows x64 beta ${{ needs.metadata.outputs.beta_version }}
DOGFOOD_VERSION: ${{ needs.metadata.outputs.beta_version }}
RELEASE_PUBLIC_ORIGIN: ${{ inputs.release_public_origin != '' && inputs.release_public_origin || vars.CLOUDFLARE_R2_RELEASES_PUBLIC_ORIGIN }}
RELEASE_STORAGE_ACCESS_KEY_ID: ${{ secrets.CLOUDFLARE_R2_RELEASES_AK }}
RELEASE_STORAGE_BUCKET: ${{ secrets.CLOUDFLARE_R2_RELEASES_BUCKET }}
RELEASE_STORAGE_ENDPOINT: ${{ secrets.CLOUDFLARE_R2_RELEASES_URL }}
RELEASE_STORAGE_REGION: auto
RELEASE_STORAGE_SECRET_ACCESS_KEY: ${{ secrets.CLOUDFLARE_R2_RELEASES_SK }}
run: pnpm exec tools-release publish-dogfood

- name: Delete failed Windows tools-pack cache
if: ${{ steps.win_tools_pack_build.outcome == 'failure' && steps.win_tools_pack_cache_restore.outputs.cache-matched-key != '' }}
shell: pwsh
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release-branch-direct-pr-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ jobs:
body="$(printf '%s\n' \
'🚫 Direct PRs into release branches are not accepted.' \
'' \
'Changes reach a release branch through the **backport flow**, not by targeting `release/*` directly:' \
"Changes reach a release branch through the **backport flow**, not by targeting \`release/*\` directly:" \
'' \
'1. Open your PR against **`main`** and get it merged there.' \
'2. Add the **`backport release/vX.Y.Z`** label to that main PR — the release bot cherry-picks it onto the release branch automatically (resolving conflicts in a draft if needed).' \
"1. Open your PR against **\`main\`** and get it merged there." \
"2. Add the **\`backport release/vX.Y.Z\`** label to that main PR — the release bot cherry-picks it onto the release branch automatically (resolving conflicts in a draft if needed)." \
'' \
'Closing this PR. If this is a genuine release-only fix that cannot go through `main`, ask a maintainer to handle it directly.')"
"Closing this PR. If this is a genuine release-only fix that cannot go through \`main\`, ask a maintainer to handle it directly.")"
gh pr comment "$PR" --repo "$REPO" --body "$body"
gh pr close "$PR" --repo "$REPO"
1 change: 1 addition & 0 deletions apps/daemon/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ The daemon is not a shared library for the web app. Do not import daemon private
- `src/runtimes/` owns agent runtime definitions, spawning, parser integration, executable discovery, and runtime environment shaping. Agent argument definitions belong in `src/runtimes/defs/`.
- `src/prompts/` owns daemon-side prompt construction. Keep mirrored BYOK/API wording in `packages/contracts/src/prompts/` when the same text is exposed outside the daemon.
- `src/plugins/`, `src/connectors/`, `src/registry/`, `src/research/`, `src/media-adapters/`, `src/live-artifacts/`, `src/storage/`, and `src/critique/` own their named domains. Prefer adding code inside the existing domain folder before creating a new top-level folder.
- Team resource storage is Vela-owned. Daemon adapters under `src/collab/vela-cli-*` must invoke Vela through `src/integrations/vela-command.ts`, which shares the login/agent binary resolver and environment. Do not add Resource Hub tokens, direct HTTP clients, or a second content-addressed drive implementation to Open Design. `od resource` is only a thin Vela CLI compatibility entry point.
- `tests/` contains daemon tests. Keep test paths roughly parallel to `src/` when useful.

Do not edit generated `dist/` output.
Expand Down
2 changes: 1 addition & 1 deletion apps/daemon/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@open-design/daemon",
"version": "0.16.1",
"version": "0.16.2",
"private": true,
"type": "module",
"main": "./dist/cli.js",
Expand Down
13 changes: 13 additions & 0 deletions apps/daemon/src/agent-protocol/acp/json.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,16 @@ export function extractAcpUpdateText(update: JsonObject): string | null {
}
return null;
}

/**
* Pull a short human-readable status detail (`message` / `detail`) off an ACP
* `session/update`, so a status event can carry e.g. a "compacting context"
* reason. Returns `undefined` when neither field is a non-empty string.
*/
export function extractAcpStatusDetail(update: JsonObject): string | undefined {
for (const key of ['message', 'detail']) {
const value = update[key];
if (typeof value === 'string' && value.trim()) return value;
}
return undefined;
}
21 changes: 21 additions & 0 deletions apps/daemon/src/agent-protocol/acp/rpc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,27 @@ export function rpcErrorRetryable(data: unknown): boolean | undefined {
const details = asObject(data);
return typeof details?.retryable === 'boolean' ? details.retryable : undefined;
}
/**
* Fallback retryability inference from the error message/details text, used when
* the runtime does not set an explicit `retryable` field. `request_too_large`
* (the prompt must shrink) is non-retryable; upstream transport blips
* (`stream idle timeout`, `overloaded`, gateway/service outages) are retryable.
* Returns `undefined` when nothing matches so callers keep their own default.
*/
export function inferRpcErrorRetryable(message: string, data: unknown): boolean | undefined {
const details = asObject(data);
const text = [
message,
details ? JSON.stringify(details) : '',
].join('\n');
if (/\b(request_too_large|request body exceeds configured limit)\b/i.test(text)) {
return false;
}
if (/\b(upstream_error|stream idle timeout|no data received within configured window|temporarily unavailable|overloaded|gateway timeout|service unavailable)\b/i.test(text)) {
return true;
}
return undefined;
}
/**
* Promotes an opencode `ROLE_MARKER_HALLUCINATION` error embedded in an ACP
* JSON-RPC `error.data` payload into a canonical Open Design error object.
Expand Down
17 changes: 13 additions & 4 deletions apps/daemon/src/agent-protocol/acp/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,15 @@ import {
ACP_RAW_EVENT_SHAPE_DIAGNOSTIC_LIMIT,
AMR_STDERR_RETRY_TAIL_LIMIT,
} from './constants.js';
import { errorMessage, asObject, extractAcpUpdateText } from './json.js';
import { errorMessage, asObject, extractAcpUpdateText, extractAcpStatusDetail } from './json.js';
import {
sendRpc,
sendRpcResult,
isJsonRpcId,
rpcErrorMessage,
rpcErrorData,
rpcErrorRetryable,
inferRpcErrorRetryable,
promotedOpenCodeSessionErrorPayload,
formatUsage,
choosePermissionOutcome,
Expand Down Expand Up @@ -92,9 +93,11 @@ export interface AttachAcpSessionOptions {
// `onCliReady` fires once on the first well-formed ACP JSON-RPC message
// (the CLI is up and speaking the protocol); `onSessionInit` fires once when
// the `session/new` handshake is acknowledged (a session id is established).
// Both are best-effort and the caller dedupes, so extra calls are harmless.
// `onPromptComplete` fires once when a clean `session/prompt` result is
// accepted. Error paths never invoke it.
onCliReady?: () => void;
onSessionInit?: () => void;
onPromptComplete?: () => void;
}
/**
* Attaches an ACP protocol session to an already-spawned child process and
Expand Down Expand Up @@ -139,6 +142,7 @@ export function attachAcpSession({
resumeSessionId,
onCliReady,
onSessionInit,
onPromptComplete,
}: AttachAcpSessionOptions) {
const runStartedAt = Date.now();
const effectiveCwd = path.resolve(cwd || process.cwd());
Expand Down Expand Up @@ -511,6 +515,10 @@ export function attachAcpSession({

const finishCleanPrompt = (usageSource?: unknown) => {
if (finished) return;
// Mark the prompt finished before notifying observers so duplicate results
// and callback re-entry cannot report clean completion more than once.
finished = true;
onPromptComplete?.();
// Flush any tools still open when the prompt completes so traces stay
// complete (one tool_use + tool_result per id).
flushOpenAcpTools();
Expand All @@ -524,7 +532,6 @@ export function attachAcpSession({
emitToolCallTextSuppressionSummary();
emitArtifactTextSuppressionSummary();
emitUsageIfPresent(usageSource);
finished = true;
clearStageTimer();
stdin.end();
// Some ACP agents keep the child process alive after stdin closes,
Expand Down Expand Up @@ -607,7 +614,7 @@ export function attachAcpSession({
failWithPayload(promotedPayload);
return;
}
const retryable = rpcErrorRetryable(details);
const retryable = rpcErrorRetryable(details) ?? inferRpcErrorRetryable(rpcErr, details);
fail(rpcErr, {
details,
...(retryable === undefined ? {} : { retryable }),
Expand All @@ -628,9 +635,11 @@ export function attachAcpSession({
}
}
if (update.sessionUpdate !== 'agent_message_chunk' && update.sessionUpdate !== 'agent_thought_chunk') {
const detail = extractAcpStatusDetail(update);
send('agent', {
type: 'status',
label: String(update.sessionUpdate || 'session_update'),
...(detail ? { detail } : {}),
elapsedMs: Date.now() - runStartedAt,
});
emitAcpRawShapeDiagnostic(update);
Expand Down
Loading
Loading