diff options
| author | adamelmore <[email protected]> | 2026-01-27 11:18:07 -0600 |
|---|---|---|
| committer | adamelmore <[email protected]> | 2026-01-27 11:38:37 -0600 |
| commit | 07d84fe008905e17894a053e4cb80fce3ae28a99 (patch) | |
| tree | 376617e44a08f54c4b65381704bc4667d389ea51 /packages/ui/src/components | |
| parent | b9edd23608deb2692049fc70218b4b2b2b87e103 (diff) | |
| download | opencode-07d84fe008905e17894a053e4cb80fce3ae28a99.tar.gz opencode-07d84fe008905e17894a053e4cb80fce3ae28a99.zip | |
feat(app): show loaded agents.md files
Diffstat (limited to 'packages/ui/src/components')
| -rw-r--r-- | packages/ui/src/components/message-part.css | 17 | ||||
| -rw-r--r-- | packages/ui/src/components/message-part.tsx | 37 |
2 files changed, 45 insertions, 9 deletions
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css index 56fe9cf41..2bef792a2 100644 --- a/packages/ui/src/components/message-part.css +++ b/packages/ui/src/components/message-part.css @@ -809,3 +809,20 @@ display: none; } } + +[data-component="tool-loaded-file"] { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 0 4px 28px; + font-family: var(--font-family-sans); + font-size: var(--font-size-small); + font-weight: var(--font-weight-regular); + line-height: var(--line-height-large); + color: var(--text-weak); + + [data-component="icon"] { + flex-shrink: 0; + color: var(--icon-weak); + } +} diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 3fde255c8..7aad01ace 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -724,20 +724,39 @@ PART_MAPPING["reasoning"] = function ReasoningPartDisplay(props) { ToolRegistry.register({ name: "read", render(props) { + const data = useData() const i18n = useI18n() const args: string[] = [] if (props.input.offset) args.push("offset=" + props.input.offset) if (props.input.limit) args.push("limit=" + props.input.limit) + const loaded = createMemo(() => { + if (props.status !== "completed") return [] + const value = props.metadata.loaded + if (!value || !Array.isArray(value)) return [] + return value.filter((p): p is string => typeof p === "string") + }) return ( - <BasicTool - {...props} - icon="glasses" - trigger={{ - title: i18n.t("ui.tool.read"), - subtitle: props.input.filePath ? getFilename(props.input.filePath) : "", - args, - }} - /> + <> + <BasicTool + {...props} + icon="glasses" + trigger={{ + title: i18n.t("ui.tool.read"), + subtitle: props.input.filePath ? getFilename(props.input.filePath) : "", + args, + }} + /> + <For each={loaded()}> + {(filepath) => ( + <div data-component="tool-loaded-file"> + <Icon name="enter" size="small" /> + <span> + {i18n.t("ui.tool.loaded")} {relativizeProjectPaths(filepath, data.directory)} + </span> + </div> + )} + </For> + </> ) }, }) |
