diff --git a/CHANGELOG.md b/CHANGELOG.md
index deb84235..3c34c5f8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,8 @@
### Fixed
+- **Workspace Artifacts pane: long filenames are fully readable and long parent directories stay inside the drawer.** A long artifact filename used to be ellipsized (so you couldn't tell files apart), and an unusually long immediate-parent directory could expand the Artifacts drawer horizontally and bleed past its edge. The list now shows the filename first with parent-preserving path truncation, and the directory tail is width-capped (`min-width: 0` + `overflow: hidden` + `text-overflow: ellipsis`) so it clips inside the card instead of blowing out the drawer. Adds behavioral/locale coverage for the artifact path lifecycle. Thanks @rodboev. (#6078, #6067)
+
- **The Kanban "New task" modal is reachable on phones again.** On a narrow viewport, a tall create-task modal was vertically centered, pushing its top (the title and first input) above the top of the screen with no way to scroll back to it. The mobile overlay now uses `align-items: safe center` and `overflow-y: auto`, so an overflowing modal keeps its top on-screen and scrolls as needed; desktop and wider layouts are unchanged. Thanks @jpalazz2. (#6301)
- **Concurrent chats under different profiles can no longer cross the profile boundary mid-turn.** In a single WebUI process, two chats streaming at once could resolve different Hermes profiles, but agent construction and later prompt/config/skill reads still depended on process-global `HERMES_HOME` and globally-patched skill-module paths after the env lock was released — so a second profile's turn could overwrite those globals mid-first-turn and bleed one profile's `SOUL.md`/skills/config into another's chat. The resolved profile home is now bound through the agent's per-thread context-local override for the entire streaming turn (and detached worker scope) and reset in the run's terminal `finally`, so concurrent profiles stay isolated even if the process globals are clobbered mid-run. Checkpoint saves skip the skill lock (no deadlock) and the capability check rejects globally-patched module state (no leak), with a serialized snapshot/patch/restore fallback that keeps older agents safe. Thanks @starship-s. (#5877, #5567, #2023)
diff --git a/static/i18n.js b/static/i18n.js
index 141fcfcc..57822182 100644
--- a/static/i18n.js
+++ b/static/i18n.js
@@ -464,6 +464,7 @@ const LOCALES = {
workspace_close_preview: 'Close preview',
workspace_files_tab: 'Files',
workspace_artifacts_tab: 'Artifacts',
+ workspace_artifact_source_session: 'session',
workspace_hidden_files_visible: 'hidden visible',
workspace_hidden_files_visible_title: 'Hidden files are visible — click for options',
workspace_options: 'Workspace options',
diff --git a/static/style.css b/static/style.css
index 86829dbd..e5f2dfe6 100644
--- a/static/style.css
+++ b/static/style.css
@@ -6432,9 +6432,11 @@ main.main > .main-view:not([id="mainChat"]):not([id="mainSettings"]) .main-view-
.workspace-artifact-empty{padding:16px 8px;color:var(--muted);font-size:12px;line-height:1.5;text-align:center;}
.workspace-artifact-item{display:block;width:100%;text-align:left;background:var(--surface-subtle);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 10px;margin-bottom:6px;cursor:pointer;}
.workspace-artifact-item:hover{border-color:var(--accent);}
-.workspace-artifact-name{font-family:'SF Mono',ui-monospace,monospace;font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text);}
-.workspace-artifact-dir{font-family:'SF Mono',ui-monospace,monospace;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--muted);margin-top:1px;}
-.workspace-artifact-meta{margin-top:3px;color:var(--muted);font-size:11px;}
+.workspace-artifact-filename{font-family:'SF Mono',ui-monospace,monospace;font-size:12px;overflow-wrap:anywhere;}
+.workspace-artifact-directory{display:flex;min-width:0;overflow:hidden;white-space:nowrap;font-family:'SF Mono',ui-monospace,monospace;font-size:11px;color:var(--muted);}
+.workspace-artifact-directory-head{min-width:0;flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;}
+.workspace-artifact-directory-tail{flex:0 0 auto;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;}
+.workspace-artifact-meta{display:inline-block;margin-top:4px;padding:1px 5px;border:1px solid var(--border);border-radius:999px;color:var(--muted);font-size:11px;line-height:1.3;}
.workspace-artifacts-count{opacity:.65;font-size:11px;}
.rightpanel[data-active-tab="artifacts"] .breadcrumb-bar,.rightpanel[data-active-tab="artifacts"] .file-tree,.rightpanel[data-active-tab="artifacts"] #wsEmptyState{display:none!important;}
.rightpanel[data-active-tab="artifacts"] .workspace-artifacts{display:block;}
diff --git a/static/workspace.js b/static/workspace.js
index 622e1e24..1e6c6a72 100644
--- a/static/workspace.js
+++ b/static/workspace.js
@@ -586,16 +586,26 @@ function renderSessionArtifacts(){
if(normWs && p.startsWith(normWs)) return p.slice(normWs.length);
return p;
};
+ const splitArtifactDisplayPath = (path) => {
+ const slash = path.lastIndexOf('/');
+ if(slash < 0) return {name: path, head: '', tail: ''};
+ const directory = path.slice(0, slash + 1);
+ const parentSlash = directory.lastIndexOf('/', directory.length - 2);
+ return {
+ name: path.slice(slash + 1),
+ head: directory.slice(0, parentSlash + 1),
+ tail: directory.slice(parentSlash + 1),
+ };
+ };
root.innerHTML = items.map(item => {
- const dPath = displayPath(item.path);
- const idx = dPath.lastIndexOf('/');
- const fileName = idx >= 0 ? dPath.slice(idx + 1) : dPath;
- const dirPath = idx >= 0 ? dPath.slice(0, idx) : '';
- return ``;
+ const path = displayPath(item.path);
+ const parts = splitArtifactDisplayPath(path);
+ const directory = (parts.head || parts.tail)
+ ? `