From 13322a1fd2dc89952ce2b4009f766d7dbaf51920 Mon Sep 17 00:00:00 2001 From: Adam Bowker Date: Fri, 17 Jul 2026 13:40:51 -0400 Subject: [PATCH 1/6] Attribute channel task rows to the human who started them Channel feed task rows rendered every message as "PostHog" with a robot avatar and an "Agent" badge, then repeated the starter's name inline in the body ("@Name started a new task"). This made the feed hard to scan and misattributed human-initiated tasks to the agent. Channel-started tasks (origin_product === "user_created") now show the starter as the sender: their initials in the avatar, their display name as the author, no "Agent" badge, and a plain "started a new task" body. Tasks from other origins (Slack, automations) keep the agent attribution so genuine agent-authored messages remain distinguishable at a glance. Mirrors the existing SystemFeedRow author-vs-agent pattern in the same file. Generated-By: PostHog Code Task-Id: 4b3b11b7-5066-448f-a721-fe8532ce15d1 --- .../canvas/components/ChannelFeedView.tsx | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx index af127b60ab..da61fee23b 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx @@ -40,7 +40,6 @@ import { formatRelativeTimeShort, getLocalDayDiff } from "@posthog/shared"; import type { Task, TaskRunStatus } from "@posthog/shared/domain-types"; import { getUserInitials } from "@posthog/ui/features/auth/userInitials"; import { TaskTabIcon } from "@posthog/ui/features/browser-tabs/TaskTabIcon"; -import { mentionChipClass } from "@posthog/ui/features/canvas/components/MentionText"; import type { ChannelFeedSystemMessage } from "@posthog/ui/features/canvas/hooks/useChannelFeedMessages"; import { useChannelTaskData } from "@posthog/ui/features/canvas/hooks/useChannelTaskData"; import { useTaskThread } from "@posthog/ui/features/canvas/hooks/useTaskThread"; @@ -424,20 +423,28 @@ const FeedItem = memo(function FeedItem({ onOpenTask: (task: Task) => void; onOpenThread: (task: Task) => void; }) { + // Only attribute channel-started tasks to a human: other origins (Slack, + // automations) carry a created_by who didn't start it here, so those stay + // agent-attributed to leave room for genuine agent-authored messages. + const starter = + task.origin_product === "user_created" ? task.created_by : null; + return ( - + {starter ? getUserInitials(starter) : } - PostHog - Agent + + {starter ? userDisplayName(starter) : "PostHog"} + + {!starter && Agent} @@ -446,20 +453,7 @@ const FeedItem = memo(function FeedItem({ - {/* Only attribute channel-started tasks: other origins (Slack, - automations) carry a created_by who didn't start it here. */} - {task.origin_product === "user_created" && task.created_by ? ( - <> - {/* Mention-styled but rendered inert: the starter shouldn't be - notified about their own task. */} - - @{userDisplayName(task.created_by)} - {" "} - started a new task - - ) : ( - "A new task was started" - )} + {starter ? "started a new task" : "A new task was started"} Date: Fri, 17 Jul 2026 13:46:19 -0400 Subject: [PATCH 2/6] Add Storybook story for channel task feed row Extract the pure presentational TaskFeedRow (avatar + attribution header + body) out of FeedItem so it can be storied; the data-fetching TaskCard and ReplyFooter stay in the FeedItem container and are passed in as children. Adds ChannelFeedView.stories.tsx covering the attribution states so the human-vs-agent sender rendering is easy to validate: human-started, human-with-email-only (initials/name fallback), non-user origin (stays agent-attributed), and user_created with no starter. Generated-By: PostHog Code Task-Id: 4b3b11b7-5066-448f-a721-fe8532ce15d1 --- .../components/ChannelFeedView.stories.tsx | 105 +++++++++++++++++ .../canvas/components/ChannelFeedView.tsx | 106 ++++++++++++------ 2 files changed, 176 insertions(+), 35 deletions(-) create mode 100644 packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx new file mode 100644 index 0000000000..b2b2b0a228 --- /dev/null +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx @@ -0,0 +1,105 @@ +import type { Task, UserBasic } from "@posthog/shared/domain-types"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { TaskFeedRow } from "./ChannelFeedView"; + +// A stand-in for the real TaskCard, which fetches its own status/PR data and so +// renders empty in Storybook. The story only needs something card-shaped under +// the attribution for the row to read realistically. +function MockTaskCard({ title }: { title: string }) { + return ( +
+
+ {title} + + Ready + +
+
+ ); +} + +const user = (overrides: Partial = {}): UserBasic => ({ + id: 1, + uuid: "user-1", + email: "adam@posthog.com", + first_name: "Adam", + last_name: "Bowker", + ...overrides, +}); + +const task = (overrides: Partial = {}): Task => ({ + id: "task-1", + task_number: 1, + slug: "task-1", + title: "Add feedback modal to channels view", + description: "", + // A fixed timestamp keeps the relative-time label stable for visual review. + created_at: "2026-07-17T12:00:00.000Z", + updated_at: "2026-07-17T12:00:00.000Z", + origin_product: "user_created", + created_by: user(), + ...overrides, +}); + +const meta: Meta = { + title: "Channels/TaskFeedRow", + component: TaskFeedRow, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +}; + +export default meta; +type Story = StoryObj; + +/** + * A channel-started task, attributed to the human who started it: initials + * avatar, their display name, no "Agent" badge, and a plain "started a new + * task" body. + */ +export const HumanStarted: Story = { + args: { + task: task(), + children: , + }, +}; + +/** + * A human with no name set falls back to the email-derived initials in the + * avatar and the email as the display name. + */ +export const HumanEmailOnly: Story = { + args: { + task: task({ + created_by: user({ first_name: undefined, last_name: undefined }), + }), + children: , + }, +}; + +/** + * A non-user origin (e.g. Slack) stays agent-attributed — robot avatar, + * "PostHog" name, "Agent" badge — even though created_by is set, because that + * person didn't start the task in the channel. + */ +export const AgentOrigin: Story = { + args: { + task: task({ origin_product: "slack", title: "Investigate signup drop-off" }), + children: , + }, +}; + +/** + * A user_created task with no created_by has no human to attribute, so it also + * falls back to the agent identity. + */ +export const NoStarter: Story = { + args: { + task: task({ created_by: null, title: "Untitled task" }), + children: , + }, +}; diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx index da61fee23b..f13595b4ee 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx @@ -37,7 +37,11 @@ import { useChatMessageScroller, } from "@posthog/quill"; import { formatRelativeTimeShort, getLocalDayDiff } from "@posthog/shared"; -import type { Task, TaskRunStatus } from "@posthog/shared/domain-types"; +import type { + Task, + TaskRunStatus, + UserBasic, +} from "@posthog/shared/domain-types"; import { getUserInitials } from "@posthog/ui/features/auth/userInitials"; import { TaskTabIcon } from "@posthog/ui/features/browser-tabs/TaskTabIcon"; import type { ChannelFeedSystemMessage } from "@posthog/ui/features/canvas/hooks/useChannelFeedMessages"; @@ -410,24 +414,31 @@ function ReplyFooter({ ); } -const FeedItem = memo(function FeedItem({ +// The human who kicked a task off in the channel, or null when the row should +// stay agent-attributed. Only channel-started tasks (user_created) are a +// person's doing; other origins (Slack, automations) carry a created_by who +// didn't start it here, so they keep the agent identity — which also leaves +// that identity free for genuine agent-authored messages in the future. +function channelTaskStarter(task: Task): UserBasic | null { + return task.origin_product === "user_created" + ? (task.created_by ?? null) + : null; +} + +// The presentational feed row: avatar + attribution header + body. The task +// card and reply footer are supplied as `children` (they fetch their own data, +// so keeping them out of here leaves the row pure and storyable); `actions` is +// the hover toolbar. +export function TaskFeedRow({ task, - channelId, - inView, - onOpenTask, - onOpenThread, + actions, + children, }: { task: Task; - channelId: string; - inView: boolean; - onOpenTask: (task: Task) => void; - onOpenThread: (task: Task) => void; + actions?: ReactNode; + children?: ReactNode; }) { - // Only attribute channel-started tasks to a human: other origins (Slack, - // automations) carry a created_by who didn't start it here, so those stay - // agent-attributed to leave room for genuine agent-authored messages. - const starter = - task.origin_product === "user_created" ? task.created_by : null; + const starter = channelTaskStarter(task); return ( @@ -456,30 +467,55 @@ const FeedItem = memo(function FeedItem({ {starter ? "started a new task" : "A new task was started"} - onOpenThread(task)} - /> - onOpenThread(task)} - /> + {children}
- {/* Replying now lives in the always-visible ReplyFooter, so the hover - toolbar only carries the distinct "Open task" action. Actions anchor - to the row's top-right corner; a top tooltip there overhangs the panel - edge and gets clipped by the scroll container, so open tooltips toward - the content instead. */} - - onOpenTask(task)}> - - - + {actions}
); +} + +const FeedItem = memo(function FeedItem({ + task, + channelId, + inView, + onOpenTask, + onOpenThread, +}: { + task: Task; + channelId: string; + inView: boolean; + onOpenTask: (task: Task) => void; + onOpenThread: (task: Task) => void; +}) { + return ( + + onOpenTask(task)}> + + + + } + > + onOpenThread(task)} + /> + onOpenThread(task)} + /> + + ); }); // One feed row: owns the scroller item (the `content-visibility` boundary, so From abd493cc5fa374d568e5866662fa26575cde2eae Mon Sep 17 00:00:00 2001 From: Adam Bowker Date: Fri, 17 Jul 2026 14:10:00 -0400 Subject: [PATCH 3/6] Format story file to satisfy Biome The AgentOrigin story's task() call exceeded the line width; wrap it so `biome check` (the CI quality gate, which runs the formatter) passes. Generated-By: PostHog Code Task-Id: 4b3b11b7-5066-448f-a721-fe8532ce15d1 --- .../features/canvas/components/ChannelFeedView.stories.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx index b2b2b0a228..c07284f60d 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx @@ -88,7 +88,10 @@ export const HumanEmailOnly: Story = { */ export const AgentOrigin: Story = { args: { - task: task({ origin_product: "slack", title: "Investigate signup drop-off" }), + task: task({ + origin_product: "slack", + title: "Investigate signup drop-off", + }), children: , }, }; From eaeb807e521b3a4474a8a8704bb06ac25a810ac5 Mon Sep 17 00:00:00 2001 From: Adam Bowker Date: Fri, 17 Jul 2026 16:06:34 -0400 Subject: [PATCH 4/6] Drop explanatory comments added in this PR Remove the doc comments I introduced on channelTaskStarter and TaskFeedRow, and all comments in the new story file, keeping only the pre-existing "Replying now lives" comment that predates this change. Generated-By: PostHog Code Task-Id: 4b3b11b7-5066-448f-a721-fe8532ce15d1 --- .../components/ChannelFeedView.stories.tsx | 22 ------------------- .../canvas/components/ChannelFeedView.tsx | 9 -------- 2 files changed, 31 deletions(-) diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx index c07284f60d..ffc591b353 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx @@ -2,9 +2,6 @@ import type { Task, UserBasic } from "@posthog/shared/domain-types"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { TaskFeedRow } from "./ChannelFeedView"; -// A stand-in for the real TaskCard, which fetches its own status/PR data and so -// renders empty in Storybook. The story only needs something card-shaped under -// the attribution for the row to read realistically. function MockTaskCard({ title }: { title: string }) { return (
@@ -33,7 +30,6 @@ const task = (overrides: Partial = {}): Task => ({ slug: "task-1", title: "Add feedback modal to channels view", description: "", - // A fixed timestamp keeps the relative-time label stable for visual review. created_at: "2026-07-17T12:00:00.000Z", updated_at: "2026-07-17T12:00:00.000Z", origin_product: "user_created", @@ -56,11 +52,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -/** - * A channel-started task, attributed to the human who started it: initials - * avatar, their display name, no "Agent" badge, and a plain "started a new - * task" body. - */ export const HumanStarted: Story = { args: { task: task(), @@ -68,10 +59,6 @@ export const HumanStarted: Story = { }, }; -/** - * A human with no name set falls back to the email-derived initials in the - * avatar and the email as the display name. - */ export const HumanEmailOnly: Story = { args: { task: task({ @@ -81,11 +68,6 @@ export const HumanEmailOnly: Story = { }, }; -/** - * A non-user origin (e.g. Slack) stays agent-attributed — robot avatar, - * "PostHog" name, "Agent" badge — even though created_by is set, because that - * person didn't start the task in the channel. - */ export const AgentOrigin: Story = { args: { task: task({ @@ -96,10 +78,6 @@ export const AgentOrigin: Story = { }, }; -/** - * A user_created task with no created_by has no human to attribute, so it also - * falls back to the agent identity. - */ export const NoStarter: Story = { args: { task: task({ created_by: null, title: "Untitled task" }), diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx index f13595b4ee..109a60ccaf 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx @@ -414,21 +414,12 @@ function ReplyFooter({ ); } -// The human who kicked a task off in the channel, or null when the row should -// stay agent-attributed. Only channel-started tasks (user_created) are a -// person's doing; other origins (Slack, automations) carry a created_by who -// didn't start it here, so they keep the agent identity — which also leaves -// that identity free for genuine agent-authored messages in the future. function channelTaskStarter(task: Task): UserBasic | null { return task.origin_product === "user_created" ? (task.created_by ?? null) : null; } -// The presentational feed row: avatar + attribution header + body. The task -// card and reply footer are supplied as `children` (they fetch their own data, -// so keeping them out of here leaves the row pure and storyable); `actions` is -// the hover toolbar. export function TaskFeedRow({ task, actions, From 6a879c803b6ddc192ccaf4ac37a8a845370eb29f Mon Sep 17 00:00:00 2001 From: Adam Bowker Date: Fri, 17 Jul 2026 16:24:19 -0400 Subject: [PATCH 5/6] Show a truncated prompt preview in channel feed rows Instead of the generic "started a new task" body, feed rows now show a two-line preview of the user's original prompt (task.description, run through xmlToPlainText to resolve chip tags), matching how the optimistic pending row already previews the prompt. Falls back to the prior text when a task has no description. Adds LongPrompt and NoPrompt stories to cover truncation and the fallback. Generated-By: PostHog Code Task-Id: 4b3b11b7-5066-448f-a721-fe8532ce15d1 --- .../components/ChannelFeedView.stories.tsx | 31 +++++++++++++++++-- .../canvas/components/ChannelFeedView.tsx | 10 ++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx index ffc591b353..8ff99ea14a 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.stories.tsx @@ -29,7 +29,8 @@ const task = (overrides: Partial = {}): Task => ({ task_number: 1, slug: "task-1", title: "Add feedback modal to channels view", - description: "", + description: + "Add a feedback modal to the channels view so people can share thoughts without leaving the feed", created_at: "2026-07-17T12:00:00.000Z", updated_at: "2026-07-17T12:00:00.000Z", origin_product: "user_created", @@ -63,6 +64,8 @@ export const HumanEmailOnly: Story = { args: { task: task({ created_by: user({ first_name: undefined, last_name: undefined }), + title: "Make background color configurable", + description: "Make the channel background color configurable in settings", }), children: , }, @@ -73,14 +76,36 @@ export const AgentOrigin: Story = { task: task({ origin_product: "slack", title: "Investigate signup drop-off", + description: "Investigate the signup drop-off we saw over the weekend", }), children: , }, }; -export const NoStarter: Story = { +export const LongPrompt: Story = { + args: { + task: task({ + description: + "Rework the channel feed so each row reads as the person who started the task rather than the agent, show a preview of their prompt under the header, keep the task card below, and make sure long prompts truncate cleanly instead of pushing the card down the feed", + }), + children: , + }, +}; + +export const NoPrompt: Story = { args: { - task: task({ created_by: null, title: "Untitled task" }), + task: task({ description: "", title: "Untitled task" }), children: , }, }; + +export const NoStarter: Story = { + args: { + task: task({ + created_by: null, + title: "Untitled task", + description: "Summarize this week's shipped changes", + }), + children: , + }, +}; diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx index 109a60ccaf..1905a1aa95 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx @@ -5,6 +5,7 @@ import { RobotIcon, } from "@phosphor-icons/react"; import { taskFeedRunStatus } from "@posthog/core/canvas/channelFeed"; +import { xmlToPlainText } from "@posthog/core/message-editor/content"; import { Avatar, AvatarFallback, @@ -430,6 +431,10 @@ export function TaskFeedRow({ children?: ReactNode; }) { const starter = channelTaskStarter(task); + const prompt = useMemo( + () => xmlToPlainText(task.description ?? "").trim(), + [task.description], + ); return ( @@ -454,8 +459,9 @@ export function TaskFeedRow({ - - {starter ? "started a new task" : "A new task was started"} + + {prompt || + (starter ? "started a new task" : "A new task was started")} {children} From 58672bb3b77d20c60d8041584bdcd7aa4a762d27 Mon Sep 17 00:00:00 2001 From: "posthog[bot]" <206114724+posthog[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 13:50:24 +0000 Subject: [PATCH 6/6] chore(visual): update storybook baselines 12 updated Run: 3d040bb6-1c65-415b-8860-4c73932ce6b8 Co-authored-by: adboio <23323033+adboio@users.noreply.github.com> --- apps/code/snapshots.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/apps/code/snapshots.yml b/apps/code/snapshots.yml index cfbdd290b1..b7488a0054 100644 --- a/apps/code/snapshots.yml +++ b/apps/code/snapshots.yml @@ -116,6 +116,30 @@ snapshots: hash: v1.k4693efd2.1d199b2c4bba8034cb18fb5b49866b64a6eb3311591add5f58ec288710dce2e9.FCc9egSaO1Onih417yciSYKNROe8zqDZyyS6xuXCZGw billing-usagemeter--zero-spend-limit--light: hash: v1.k4693efd2.b50c18736bbde45fc89f4c0ac7fd616286e5c1ecc2a56910fffca13eaa13d8a2.31z4F0JmvMeR4yqk5pjs_OQ3MypnM2miZI9al4wuc8c + channels-taskfeedrow--agent-origin--dark: + hash: v1.k4693efd2.82f8c70a399c9ea768201933e202fcc2fde74332c5153aeabf6835ace79beee6.-SVboDRIZ_-nh4PtMliCv7e7iCtdUm-1m2xQ9Xzcdfw + channels-taskfeedrow--agent-origin--light: + hash: v1.k4693efd2.4c1db3470d5ec9b4db9872d0e048314d0078979e8fbdb602b8c648ba70d7209f._KPUvj46p33u7A4Xndz-git-4rp7VKca1MpeTztlB6w + channels-taskfeedrow--human-email-only--dark: + hash: v1.k4693efd2.0f4dece4643b7375b77746347658f4fe65b37817cdfa9ad1ba697067e619f428.f0jKZ4OYqsmeJjXffjt-amK9cwE81JF0lgSMqtn37PA + channels-taskfeedrow--human-email-only--light: + hash: v1.k4693efd2.14db0510f7ea5c57985cf0cb60ab08f5e146c7243eeb1b0b963f74e85c7d60f4.ijHQLK0lZjjUlOQuzYzisImU9DWsNmZM7i5GYfWU4E0 + channels-taskfeedrow--human-started--dark: + hash: v1.k4693efd2.e0abdae2e8ac2ef29793ea7afc2a2580c6610e07a3c640ad782af7fd3c12592a.YUgF_BTPzZoqnWXvyLBRs3w9C_P3Yfh4-cP4mUqs2NQ + channels-taskfeedrow--human-started--light: + hash: v1.k4693efd2.84c26deb1a587fe061238b3982b555167575893bacc9cd2667d4d3f74646261f.abqc0Voe6FIQFflzDJTv1KewcZ4XxcDz1a0mFlJu7oM + channels-taskfeedrow--long-prompt--dark: + hash: v1.k4693efd2.2547e88d76889aa7290c5221ff5ecb674cdb1cd9f1ae5efd211fb648a88037b6.4c9RO1upuz3VijYp2xU2MTNrW_87zWQLX5kRKCYABq4 + channels-taskfeedrow--long-prompt--light: + hash: v1.k4693efd2.6b0f609e0155bc3b6e3149714b70d33ef83f7c2ca7b72e6d3a495b8db36828d0.eC5ZQDilDw7Y9EJqhfIdlk186GJjgGbYolZ9cm9Xtt0 + channels-taskfeedrow--no-prompt--dark: + hash: v1.k4693efd2.9fa967f1a9acdeba0c50a9e45ae649f118ee26938037dbefd1bb0577067b03d4.va1lGsscqLW86-5yCKc3H6pQ8Az7_HBItkgGTnTQiYU + channels-taskfeedrow--no-prompt--light: + hash: v1.k4693efd2.a02339aecdb6fc327fdf6586e28ceeebf8490442fe217eb8bb46f1ce66bff78a.2l7XdvdW3D0GlLmPwDdTFgjZWdav68bZX_LYResVKwo + channels-taskfeedrow--no-starter--dark: + hash: v1.k4693efd2.66fff212f14afa9dd3bc532698a042383014a0cabd4331d30eff878148e1773d.RiectZxFTqk1husLYI-UV5ko1uZ4lpbjWstE7Hy3MJE + channels-taskfeedrow--no-starter--light: + hash: v1.k4693efd2.9ee4ad64ed7d2c5c62d0cd682d903b09da643d462d49aae0858afa500e92256b.OhGj64l-o7iWtxzJo1qt0A_CU9ME0ZRr_5e455RGUJQ components-permissions-permissionselector--create-new-file--dark: hash: v1.k4693efd2.c54203a4e636b83b3d24d7ed9c4ace8659db87cd8f231d9dc2ecc03320e31646.epDm7LebiLzlp0uuZBrE-Obt_anAn0xsE8bHFnm5vos components-permissions-permissionselector--create-new-file--light: