* feat(config): add canonical group-policy scope-tree resolver
* chore(plugin-sdk): refresh API baseline hash for scope-tree exports
* refactor(channels): migrate googlechat, imessage, and whatsapp group policy onto the scope tree
* chore(plugin-sdk): refresh API baseline hash for groups scope-tree builder
* refactor(channels): migrate line, qqbot, and mattermost group policy onto the scope tree
* chore(plugin-sdk): refresh API baseline hash for case-insensitive scope key helper
* chore(plugin-sdk): refresh API baseline hash after rebase onto current main
* chore(plugin-sdk): refresh API baseline hash after rebase
* chore(plugin-sdk): refresh API baseline hash after rebase
* chore(plugin-sdk): refresh API baseline hash after rebase
* fix(sandbox): use canonical shortenHomePath for sandbox-root escape error
The local shortPath helper shortened any path with the home directory as a
string prefix, with no separator boundary, so a home-sibling sandbox root was
mangled in the escape error: homedir /Users/al + root /Users/albert/proj
rendered as ~bert/proj. Delete the duplicate helper and reuse the canonical,
boundary-safe shortenHomePath from ../utils (the same fix already applied to the
other home-path shorteners), keeping one canonical path per repo policy.
Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com>
* test(sandbox): cover home-sibling diagnostics
* test(sandbox): make path proof portable
---------
Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* refactor(channels): consolidate the flat streaming fallback into the deprecation module
* chore(plugin-sdk): refresh API baseline hash for compat module move
* chore: re-attach CI to the rescoped head
* chore(plugin-sdk): refresh API baseline hash after rebase
* chore(plugin-sdk): refresh API baseline hash after rebase
* fix(wizard): defer config commit until after migration apply succeeds
Onboarding migration import commits the config file to disk before the
migration provider's apply() runs. If apply() legitimately reports an
error on any item, runSetupMigrationImport() throws, but the config is
already committed with wizard metadata stamped on it. On the very next
onboarding attempt, the freshness gate sees that stamped config and
refuses to run the import, telling the user a fresh setup is required.
Move the commitConfigFile call to after assertApplySucceeded(), so a
failed apply never leaves wizard metadata on disk that blocks the next
retry behind the fresh-setup gate.
The in-memory config still has wizard metadata applied before the apply
context is constructed (so the apply function can reference a concrete
target), but the disk write only happens after apply succeeds.
Fixes#103262
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(lint): remove useless assignment in migration config commit
The `targetConfig = await params.commitConfigFile(targetConfig)` line
assigns to `targetConfig` but the value is never read afterwards.
Remove the assignment, keeping the side-effect call.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(wizard): preserve config patches from provider apply after commit
Restore the targetConfig assignment from commitConfigFile so that config
patches written by the provider during apply (e.g. auth profile
selections) are carried forward. Without this, the pre-apply snapshot
silently replaces the post-apply config, losing provider-authored
patches.
Fixes#103262
* fix: remove useless assignment to satisfy lint
commitConfigFile persists the config to disk; the returned config with
patches is already on disk, making the in-memory assignment unnecessary.
* fix(wizard): make Hermes import retries recoverable
* chore: keep release notes release-owned
* fix(wizard): keep retry identity stable across acknowledgement
* fix(wizard): satisfy Hermes retry quality gates
* test(wizard): use managed migration temp dirs
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* improve(ui): drop page subtitles from settings and hub headers
The one-line page subtitles restated the nav label the user just
clicked ('Channels and settings.') while sections and rows already
carry contextual descriptions; every header now reads title-only,
matching the settings design language reference. Subtitle strings stay
in app-navigation for settings-search matching and the sidebar search
blocks. Removes the now-unused .page-sub rule.
* fix(ui): give Skills and Skill Workshop route-specific page titles
* chore(ui): drop unused configPageSubtitle helper
* feat(control-ui): show compaction savings and run time
* fix(control-ui): satisfy locale and export checks
* fix(control-ui): refresh locale metadata
* refactor(ui): add Web Awesome foundation
* refactor(ui): migrate shared menus and chat controls
* refactor(ui): migrate page controls to Web Awesome
* refactor(ui): migrate workboard controls to Web Awesome
* fix(ui): harden Web Awesome interactions
* test(ui): type Web Awesome dropdown state
* fix(ui): preserve menu focus and selection
* fix(ui): restore agent picker focus
* fix(ui): track keyboard menu dismissal
* fix(ui): ignore stale session menu closes
* fix(ui): complete Web Awesome keyboard migration
* fix(ui): repair Web Awesome lockfile graph
* docs(ui): keep release note in PR body
* fix(ui): satisfy Web Awesome migration gates
* perf(ui): keep Web Awesome theme in startup stylesheet
* fix(ui): replace reopened Web Awesome session menus
* fix(ui): keep replacement session menus open