Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
767 commits
Select commit Hold shift + click to select a range
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
e71f0ea
fix(web): isolate collaboration presence sessions
lefarcen Aug 3, 2026
43b9636
fix(web): parallelize scoped project route bootstrap
lefarcen Aug 3, 2026
06a96e0
perf(daemon): cache workspace project list authority
lefarcen Aug 3, 2026
578d86f
fix(web): preserve project-open connection budget
lefarcen Aug 3, 2026
626d4e1
test(web): preserve memory toast exports in app mock
lefarcen Aug 3, 2026
d8db6f7
fix(web): preserve exact project opening scope
lefarcen Aug 3, 2026
043339f
fix(daemon): coalesce scoped comment pulls
lefarcen Aug 3, 2026
d5ad236
fix(daemon): retry team comment relay delivery
lefarcen Aug 3, 2026
4afbfc3
fix(daemon): atomically queue comment relay writes
lefarcen Aug 3, 2026
99dc466
fix(collab): show team comments across local conversations
lefarcen Aug 3, 2026
e7411fc
fix(daemon): preserve catalog-only projects on unshare
lefarcen Aug 3, 2026
e8c9186
fix(collab): close comment realtime catch-up gaps
lefarcen Aug 3, 2026
822da02
docs: add workspace team rollout runbook
lefarcen Aug 3, 2026
e04e032
fix(collab): retry failed Team project shares
lefarcen Aug 3, 2026
b7bb618
fix(workspace): isolate personal projects in recent lists
lefarcen Aug 3, 2026
9fb1d33
fix(daemon): isolate personal design systems
lefarcen Aug 3, 2026
1e54117
fix(workspace): authorize runs before plugin snapshots
lefarcen Aug 3, 2026
f06108e
test(daemon): align workspace retry contracts
lefarcen Aug 3, 2026
9882fab
fix: isolate plugins and skills by workspace member
lefarcen Aug 3, 2026
20c2bd8
fix(workspace): scope design systems in run prompts
lefarcen Aug 3, 2026
85a3b01
fix(workspace): gate runs before plugin resolution
lefarcen Aug 3, 2026
ea0e3ff
fix(daemon): namespace team design system bindings
lefarcen Aug 3, 2026
52922e8
fix: close plugin and skill scope leaks
lefarcen Aug 3, 2026
8249ebf
test(collab): cover project-scoped comment actions
lefarcen Aug 3, 2026
89411d9
fix(workspace): scope project resource selection
lefarcen Aug 3, 2026
7d159c5
fix(workspace): preserve personal design system reads
lefarcen Aug 3, 2026
9761640
fix(workspace): authorize scoped run resources first
lefarcen Aug 3, 2026
d24f43a
fix(workspace): keep project design systems scoped
lefarcen Aug 3, 2026
8d464c1
fix(types): carry design system member scope
lefarcen Aug 3, 2026
225a775
fix(billing): scope personal balances by workspace
lefarcen Aug 3, 2026
3e7587e
fix(workspace): preserve unbound local design systems
lefarcen Aug 3, 2026
edadb34
Merge remote-tracking branch 'origin/feat/workspace-team' into integr…
lefarcen Aug 3, 2026
a1008d6
fix: resolve team design systems by canonical binding
lefarcen Aug 3, 2026
e9d9056
fix(workspace): invalidate nested project catalog cache
lefarcen Aug 3, 2026
e22f49e
fix: keep team design system runs canonical
lefarcen Aug 3, 2026
5b9c758
perf: batch durable comment relay delivery
lefarcen Aug 3, 2026
7e487b9
fix: cancel stale local comment relays
lefarcen Aug 3, 2026
54f7839
fix(web): preserve scoped project display snapshots
lefarcen Aug 3, 2026
8de1a58
fix(web): synchronize project rename projections
lefarcen Aug 3, 2026
201d481
perf: reuse request-scoped workspace authority
lefarcen Aug 3, 2026
39e8579
test: enforce personal project creator ownership
lefarcen Aug 3, 2026
d0f11d1
fix(web): wait for project workspace authority
lefarcen Aug 3, 2026
abab832
fix(daemon): invalidate team project caches before signaling
lefarcen Aug 3, 2026
028d132
fix(web): order targeted project metadata refreshes
lefarcen Aug 3, 2026
e1ab1d3
fix(workspace): preserve team catalog on outages
lefarcen Aug 3, 2026
0213b41
fix(web): isolate catalog display across accounts
lefarcen Aug 3, 2026
f984b0c
fix(web): scope extension marketplace catalogs
lefarcen Aug 3, 2026
d9664f8
fix(web): order broad team catalog refreshes
lefarcen Aug 3, 2026
c5f8d9d
fix(web): scope home plugins to workspace identity
lefarcen Aug 3, 2026
4c1ed3b
fix(web): isolate plugin views by workspace identity
lefarcen Aug 3, 2026
b4a32ff
Merge origin/main into feat/workspace-team
lefarcen Aug 3, 2026
80d5e98
fix(web): polish sign-in and composer focus
lefarcen Aug 3, 2026
758f515
fix(web): preserve scoped project state after team moves
lefarcen Aug 3, 2026
a0c7a53
fix(workspace): enforce scoped design and billing identity
lefarcen Aug 3, 2026
41458b2
test(e2e): align workspace flows with scoped bootstrap
lefarcen Aug 3, 2026
5e19672
Merge remote-tracking branch 'origin/feat/workspace-team' into integr…
lefarcen Aug 3, 2026
323d282
fix(collab): drain newer comment revisions promptly
lefarcen Aug 3, 2026
bdf74ea
test(e2e): keep owner actions after workspace lock
lefarcen Aug 3, 2026
90e549a
fix(web): converge project renames across scoped lists
lefarcen Aug 3, 2026
27fed18
fix(web): preserve pending projects across view changes
lefarcen Aug 3, 2026
d10ff1c
fix(web): restore preview runtime after activation
lefarcen Aug 3, 2026
beb0469
test(e2e): align workspace scope assertions
lefarcen Aug 3, 2026
fbd0757
test(web): cover hidden stream recovery
lefarcen Aug 3, 2026
16d2e2d
fix(web): update deep-link project titles after rename
lefarcen Aug 3, 2026
f30b653
fix(collab): retry project metadata propagation
lefarcen Aug 3, 2026
d3674da
fix(web): preserve legacy design system logos
lefarcen Aug 3, 2026
660d2a2
fix(web): wait for activated preview bridge
lefarcen Aug 3, 2026
97f0bf6
fix(design-systems): isolate team resource storage
lefarcen Aug 3, 2026
278ba25
fix(plugins): reject team mirror mutations
lefarcen Aug 3, 2026
52165e1
fix(web): partition extension catalogs by workspace
lefarcen Aug 3, 2026
da3ebb2
fix(skills): isolate team mirrors by workspace
lefarcen Aug 3, 2026
19a0f6d
fix(plugins): keep local share projects unscoped
lefarcen Aug 3, 2026
ad9645c
fix(web): retry preview state capture during activation
lefarcen Aug 3, 2026
89bf5a3
test(e2e): scope project workspace fixtures explicitly
lefarcen Aug 3, 2026
3387044
feat(collab): coordinate team resource invalidations
lefarcen Aug 3, 2026
80189d2
fix(collab): emit team resource changes after sync
lefarcen Aug 3, 2026
10c76aa
fix(web): invalidate project lists after updates
lefarcen Aug 3, 2026
8cc0a18
fix(web): serialize project renames by scope
lefarcen Aug 3, 2026
e2d0fd3
fix(collab): preserve team project comment anchors
lefarcen Aug 3, 2026
b24210f
fix(web): refresh shared resources after remote changes
lefarcen Aug 3, 2026
75f118e
fix(collab): materialize team projects before rename
lefarcen Aug 3, 2026
ec729da
fix(web): keep workspace catalogs current
lefarcen Aug 3, 2026
1521221
fix(web): close catalog and credential races
lefarcen Aug 4, 2026
00840e9
test(workspace): harden team workflows and packaged deep links (#6358)
AmyShang-alt Aug 4, 2026
9d3928c
feat(analytics): track Workspace interactions (#6397)
open-design-crew[bot] Aug 4, 2026
3dcc488
fix(daemon): preserve team comments across conversations
lefarcen Aug 4, 2026
7ec41c4
fix(collab): keep presence rosters converged
lefarcen Aug 4, 2026
15f7052
fix(comments): preserve routed comment anchors
lefarcen Aug 4, 2026
70173d7
fix(workspace): reconcile team project renames
lefarcen Aug 4, 2026
ca53fa2
fix(collab): preserve member directory last-good state
lefarcen Aug 4, 2026
bed9870
perf(collab): start scoped Team presence before status
lefarcen Aug 4, 2026
b069db7
fix(comments): keep relay anchors internal
lefarcen Aug 4, 2026
0dc941d
perf(collab): warm presence from daemon cache
lefarcen Aug 4, 2026
8ca5773
perf(collab): cancel obsolete cold status polls
lefarcen Aug 4, 2026
671d3e4
fix: fence presence sessions against late heartbeats
lefarcen Aug 4, 2026
cd0ebcd
perf(collab): share team member roster scheduling
lefarcen Aug 4, 2026
e33e9e7
fix(collab): preserve roster store through strict replay
lefarcen Aug 4, 2026
a9f6704
perf(collab): retain workspace member directory stores
lefarcen Aug 4, 2026
384fc06
fix(collab): resolve presence identities from team directory
lefarcen Aug 4, 2026
24de1e8
fix(collab): hide unresolved presence identities
lefarcen Aug 4, 2026
2fab6eb
fix(collab): prefer directory presence names
lefarcen Aug 4, 2026
4343158
perf(web): preload workspace member directory
lefarcen Aug 4, 2026
b613730
test(collab): preserve no-leave lifecycle contract
lefarcen Aug 4, 2026
1fd00b7
fix(web): preserve personal workspace presence after share
lefarcen Aug 4, 2026
b5431ec
fix(web): refresh covers after team materialization
lefarcen Aug 4, 2026
0549104
fix(web): refresh files after team materialization
lefarcen Aug 4, 2026
0f17f72
fix(web): gate shared file reads on project authority
lefarcen Aug 4, 2026
4e1ad2a
merge main into feat/workspace-team
lefarcen Aug 4, 2026
ebfaaf6
fix(web): preserve workspace folder action sizing
lefarcen Aug 4, 2026
de7d7c5
ci(e2e): split project-workspace UI P0 shard into project-workspace +…
lefarcen Aug 4, 2026
92a3d93
fix(collab): revoke unshared team project mirrors
lefarcen Aug 4, 2026
3a30704
fix(web): preserve unbound project authority across workspace changes
lefarcen Aug 4, 2026
630b084
fix(web): pair scoped raw queries with headers
lefarcen Aug 4, 2026
47270e9
test(e2e): pin writable scope for project actions
lefarcen Aug 4, 2026
50c3c5b
test(web): cover Personal authority recovery after reload
lefarcen Aug 4, 2026
05511c8
test(web): await version preview readiness
lefarcen Aug 4, 2026
8a59747
fix(workspace): scope brand design system resources
lefarcen Aug 4, 2026
6e8fb03
fix(workspace): materialize owner team design systems
lefarcen Aug 4, 2026
4633f84
fix(web): fence design system reads by generation
lefarcen Aug 4, 2026
b19e60b
fix(web): propagate brand read generations
lefarcen Aug 4, 2026
168d15d
fix(web): preserve workspace project visibility
lefarcen Aug 4, 2026
1e37e72
fix(preview): retain scope for runtime relative assets
lefarcen Aug 4, 2026
6575cc4
fix(web): explain design system delete denial
lefarcen Aug 4, 2026
248e486
fix(daemon): bound team resource prewarm scopes
lefarcen Aug 4, 2026
85167b0
fix(daemon): recheck prewarm lease after queue
lefarcen Aug 4, 2026
fdb937d
fix(web): stabilize transient presence roster gaps
lefarcen Aug 4, 2026
1d02222
chore(pack): pin Vela CLI 0.0.28
lefarcen Aug 4, 2026
b4a0abe
fix(workspace): move design system project with team share
lefarcen Aug 4, 2026
996a5c0
fix(workspace): gate linked unshare on live authority
lefarcen Aug 4, 2026
5970960
fix(workspace): ensure backing project before design share
lefarcen Aug 4, 2026
03a7af5
fix(web): scope srcdoc preview assets
lefarcen Aug 4, 2026
97b1aa3
perf(web): mint preview scope only for srcdoc
lefarcen Aug 4, 2026
1e84db6
perf(web): reuse srcdoc preview scope
lefarcen Aug 4, 2026
ee92e88
Merge remote-tracking branch 'origin/main' into sync/main-into-worksp…
lefarcen Aug 4, 2026
5f7766d
chore(nix): refresh pnpm deps hashes for vela-cli 0.0.28
lefarcen Aug 4, 2026
da39c9a
Merge remote-tracking branch 'origin/main' into sync/main-into-worksp…
lefarcen Aug 4, 2026
c9336ac
chore(ci): retrigger workspace-team validation
lefarcen Aug 4, 2026
fa9a38c
perf(web): skip preview mint for authored base
lefarcen Aug 4, 2026
1474185
fix(collab): preserve presence through lease gaps
lefarcen Aug 4, 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 @@ -753,6 +753,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
23 changes: 23 additions & 0 deletions apps/daemon/src/analytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,13 +234,20 @@ export interface AnalyticsService {
properties?: Record<string, unknown>;
insertId?: string;
}): Promise<void>;
identifyGroup(args: {
context: AnalyticsContext;
groupType: 'workspace';
groupKey: string;
properties: Record<string, unknown>;
}): Promise<void>;
shutdown(): Promise<void>;
}

const NOOP_SERVICE: AnalyticsService = {
capture: async () => undefined,
captureSafety: async () => undefined,
mergeAnonymousPerson: async () => undefined,
identifyGroup: async () => undefined,
shutdown: async () => undefined,
};

Expand Down Expand Up @@ -414,6 +421,22 @@ export function createAnalyticsService(args: {
// Attribution merge failures must not block app startup or consent.
}
},
identifyGroup: async ({ context, groupType, groupKey, properties }) => {
try {
const appCfg = await readAppConfig(args.dataDir);
if (appCfg.telemetry?.metrics !== true) return;
const cleanProperties = cleanPosthogPersonProperties(properties);
if (!groupKey || Object.keys(cleanProperties).length === 0) return;
client.groupIdentify({
groupType,
groupKey,
distinctId: context.deviceId,
properties: cleanProperties,
});
} catch {
// Group updates are best-effort and must never affect product reads.
}
},
shutdown: async () => {
try {
await client.shutdown();
Expand Down
Loading
Loading