feat: structured artifact rendering, UX improvements
- Render structured artifacts from agent results with type-aware formatting: code blocks with syntax highlighting and copy button, terminal-style command output, search result cards, and text findings - Make FinalResult panel collapsible (default collapsed) with scrollable content (max-h-96) to prevent dominating the chat view - Add clickable URL detection in summaries and artifact content - Fix code block contrast for both light and dark mode - Animate progress bar with pulse ring on active step and gradient shimmer on connecting lines - Fix tab-switching bug: use module-level orchestrationStore singleton so orchestration state survives route navigation - Remove sample/demo data seeding and clean up persisted localStorage entries from previous sample sessions - Remove showSampleBadge prop from PageHeader - Regenerate proto types for new Artifact message and ArtifactType enum - Update README project structure (remove deleted data/ directory) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,47 @@ import type { Message } from "@bufbuild/protobuf";
|
||||
* Describes the file llm_multiverse/v1/common.proto.
|
||||
*/
|
||||
export const file_llm_multiverse_v1_common: GenFile = /*@__PURE__*/
|
||||
fileDesc("Ch5sbG1fbXVsdGl2ZXJzZS92MS9jb21tb24ucHJvdG8SEWxsbV9tdWx0aXZlcnNlLnYxImoKD0FnZW50SWRlbnRpZmllchIQCghhZ2VudF9pZBgBIAEoCRIwCgphZ2VudF90eXBlGAIgASgOMhwubGxtX211bHRpdmVyc2UudjEuQWdlbnRUeXBlEhMKC3NwYXduX2RlcHRoGAMgASgNIkIKDEFnZW50TGluZWFnZRIyCgZhZ2VudHMYASADKAsyIi5sbG1fbXVsdGl2ZXJzZS52MS5BZ2VudElkZW50aWZpZXIi1wEKDlNlc3Npb25Db250ZXh0EhIKCnNlc3Npb25faWQYASABKAkSDwoHdXNlcl9pZBgCIAEoCRI2Cg1hZ2VudF9saW5lYWdlGAMgASgLMh8ubGxtX211bHRpdmVyc2UudjEuQWdlbnRMaW5lYWdlEjgKDm92ZXJyaWRlX2xldmVsGAQgASgOMiAubGxtX211bHRpdmVyc2UudjEuT3ZlcnJpZGVMZXZlbBIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKdAQoLRXJyb3JEZXRhaWwSDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEj4KCG1ldGFkYXRhGAMgAygLMiwubGxtX211bHRpdmVyc2UudjEuRXJyb3JEZXRhaWwuTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiZwoPTWVtb3J5Q2FuZGlkYXRlEg8KB2NvbnRlbnQYASABKAkSLwoGc291cmNlGAIgASgOMh8ubGxtX211bHRpdmVyc2UudjEuUmVzdWx0U291cmNlEhIKCmNvbmZpZGVuY2UYAyABKAIiwwIKDlN1YmFnZW50UmVzdWx0Ei8KBnN0YXR1cxgBIAEoDjIfLmxsbV9tdWx0aXZlcnNlLnYxLlJlc3VsdFN0YXR1cxIPCgdzdW1tYXJ5GAIgASgJEhEKCWFydGlmYWN0cxgDIAMoCRI4Cg5yZXN1bHRfcXVhbGl0eRgEIAEoDjIgLmxsbV9tdWx0aXZlcnNlLnYxLlJlc3VsdFF1YWxpdHkSLwoGc291cmNlGAUgASgOMh8ubGxtX211bHRpdmVyc2UudjEuUmVzdWx0U291cmNlEkEKFW5ld19tZW1vcnlfY2FuZGlkYXRlcxgGIAMoCzIiLmxsbV9tdWx0aXZlcnNlLnYxLk1lbW9yeUNhbmRpZGF0ZRIbCg5mYWlsdXJlX3JlYXNvbhgHIAEoCUgAiAEBQhEKD19mYWlsdXJlX3JlYXNvbiqoAQoJQWdlbnRUeXBlEhoKFkFHRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIbChdBR0VOVF9UWVBFX09SQ0hFU1RSQVRPUhABEhkKFUFHRU5UX1RZUEVfUkVTRUFSQ0hFUhACEhQKEEFHRU5UX1RZUEVfQ09ERVIQAxIXChNBR0VOVF9UWVBFX1NZU0FETUlOEAQSGAoUQUdFTlRfVFlQRV9BU1NJU1RBTlQQBSr1AQoIVG9vbFR5cGUSGQoVVE9PTF9UWVBFX1VOU1BFQ0lGSUVEEAASGQoVVE9PTF9UWVBFX01FTU9SWV9SRUFEEAESGgoWVE9PTF9UWVBFX01FTU9SWV9XUklURRACEhgKFFRPT0xfVFlQRV9XRUJfU0VBUkNIEAMSFQoRVE9PTF9UWVBFX0ZTX1JFQUQQBBIWChJUT09MX1RZUEVfRlNfV1JJVEUQBRIWChJUT09MX1RZUEVfUlVOX0NPREUQBhIXChNUT09MX1RZUEVfUlVOX1NIRUxMEAcSHQoZVE9PTF9UWVBFX1BBQ0tBR0VfSU5TVEFMTBAIKnoKDU92ZXJyaWRlTGV2ZWwSHgoaT1ZFUlJJREVfTEVWRUxfVU5TUEVDSUZJRUQQABIXChNPVkVSUklERV9MRVZFTF9OT05FEAESGAoUT1ZFUlJJREVfTEVWRUxfUkVMQVgQAhIWChJPVkVSUklERV9MRVZFTF9BTEwQAyp9CgxSZXN1bHRTdGF0dXMSHQoZUkVTVUxUX1NUQVRVU19VTlNQRUNJRklFRBAAEhkKFVJFU1VMVF9TVEFUVVNfU1VDQ0VTUxABEhkKFVJFU1VMVF9TVEFUVVNfUEFSVElBTBACEhgKFFJFU1VMVF9TVEFUVVNfRkFJTEVEEAMqhwEKDVJlc3VsdFF1YWxpdHkSHgoaUkVTVUxUX1FVQUxJVFlfVU5TUEVDSUZJRUQQABIbChdSRVNVTFRfUVVBTElUWV9WRVJJRklFRBABEhsKF1JFU1VMVF9RVUFMSVRZX0lORkVSUkVEEAISHAoYUkVTVUxUX1FVQUxJVFlfVU5DRVJUQUlOEAMqhgEKDFJlc3VsdFNvdXJjZRIdChlSRVNVTFRfU09VUkNFX1VOU1BFQ0lGSUVEEAASHQoZUkVTVUxUX1NPVVJDRV9UT09MX09VVFBVVBABEiEKHVJFU1VMVF9TT1VSQ0VfTU9ERUxfS05PV0xFREdFEAISFQoRUkVTVUxUX1NPVVJDRV9XRUIQA2IGcHJvdG8z", [file_google_protobuf_timestamp]);
|
||||
fileDesc("Ch5sbG1fbXVsdGl2ZXJzZS92MS9jb21tb24ucHJvdG8SEWxsbV9tdWx0aXZlcnNlLnYxItABCghBcnRpZmFjdBINCgVsYWJlbBgBIAEoCRIPCgdjb250ZW50GAIgASgJEjYKDWFydGlmYWN0X3R5cGUYAyABKA4yHy5sbG1fbXVsdGl2ZXJzZS52MS5BcnRpZmFjdFR5cGUSOwoIbWV0YWRhdGEYBCADKAsyKS5sbG1fbXVsdGl2ZXJzZS52MS5BcnRpZmFjdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJqCg9BZ2VudElkZW50aWZpZXISEAoIYWdlbnRfaWQYASABKAkSMAoKYWdlbnRfdHlwZRgCIAEoDjIcLmxsbV9tdWx0aXZlcnNlLnYxLkFnZW50VHlwZRITCgtzcGF3bl9kZXB0aBgDIAEoDSJCCgxBZ2VudExpbmVhZ2USMgoGYWdlbnRzGAEgAygLMiIubGxtX211bHRpdmVyc2UudjEuQWdlbnRJZGVudGlmaWVyItcBCg5TZXNzaW9uQ29udGV4dBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB3VzZXJfaWQYAiABKAkSNgoNYWdlbnRfbGluZWFnZRgDIAEoCzIfLmxsbV9tdWx0aXZlcnNlLnYxLkFnZW50TGluZWFnZRI4Cg5vdmVycmlkZV9sZXZlbBgEIAEoDjIgLmxsbV9tdWx0aXZlcnNlLnYxLk92ZXJyaWRlTGV2ZWwSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAinQEKC0Vycm9yRGV0YWlsEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI+CghtZXRhZGF0YRgDIAMoCzIsLmxsbV9tdWx0aXZlcnNlLnYxLkVycm9yRGV0YWlsLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBImcKD01lbW9yeUNhbmRpZGF0ZRIPCgdjb250ZW50GAEgASgJEi8KBnNvdXJjZRgCIAEoDjIfLmxsbV9tdWx0aXZlcnNlLnYxLlJlc3VsdFNvdXJjZRISCgpjb25maWRlbmNlGAMgASgCIuACCg5TdWJhZ2VudFJlc3VsdBIvCgZzdGF0dXMYASABKA4yHy5sbG1fbXVsdGl2ZXJzZS52MS5SZXN1bHRTdGF0dXMSDwoHc3VtbWFyeRgCIAEoCRIuCglhcnRpZmFjdHMYAyADKAsyGy5sbG1fbXVsdGl2ZXJzZS52MS5BcnRpZmFjdBI4Cg5yZXN1bHRfcXVhbGl0eRgEIAEoDjIgLmxsbV9tdWx0aXZlcnNlLnYxLlJlc3VsdFF1YWxpdHkSLwoGc291cmNlGAUgASgOMh8ubGxtX211bHRpdmVyc2UudjEuUmVzdWx0U291cmNlEkEKFW5ld19tZW1vcnlfY2FuZGlkYXRlcxgGIAMoCzIiLmxsbV9tdWx0aXZlcnNlLnYxLk1lbW9yeUNhbmRpZGF0ZRIbCg5mYWlsdXJlX3JlYXNvbhgHIAEoCUgAiAEBQhEKD19mYWlsdXJlX3JlYXNvbiqoAQoJQWdlbnRUeXBlEhoKFkFHRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIbChdBR0VOVF9UWVBFX09SQ0hFU1RSQVRPUhABEhkKFUFHRU5UX1RZUEVfUkVTRUFSQ0hFUhACEhQKEEFHRU5UX1RZUEVfQ09ERVIQAxIXChNBR0VOVF9UWVBFX1NZU0FETUlOEAQSGAoUQUdFTlRfVFlQRV9BU1NJU1RBTlQQBSr1AQoIVG9vbFR5cGUSGQoVVE9PTF9UWVBFX1VOU1BFQ0lGSUVEEAASGQoVVE9PTF9UWVBFX01FTU9SWV9SRUFEEAESGgoWVE9PTF9UWVBFX01FTU9SWV9XUklURRACEhgKFFRPT0xfVFlQRV9XRUJfU0VBUkNIEAMSFQoRVE9PTF9UWVBFX0ZTX1JFQUQQBBIWChJUT09MX1RZUEVfRlNfV1JJVEUQBRIWChJUT09MX1RZUEVfUlVOX0NPREUQBhIXChNUT09MX1RZUEVfUlVOX1NIRUxMEAcSHQoZVE9PTF9UWVBFX1BBQ0tBR0VfSU5TVEFMTBAIKnoKDU92ZXJyaWRlTGV2ZWwSHgoaT1ZFUlJJREVfTEVWRUxfVU5TUEVDSUZJRUQQABIXChNPVkVSUklERV9MRVZFTF9OT05FEAESGAoUT1ZFUlJJREVfTEVWRUxfUkVMQVgQAhIWChJPVkVSUklERV9MRVZFTF9BTEwQAyp9CgxSZXN1bHRTdGF0dXMSHQoZUkVTVUxUX1NUQVRVU19VTlNQRUNJRklFRBAAEhkKFVJFU1VMVF9TVEFUVVNfU1VDQ0VTUxABEhkKFVJFU1VMVF9TVEFUVVNfUEFSVElBTBACEhgKFFJFU1VMVF9TVEFUVVNfRkFJTEVEEAMqhwEKDVJlc3VsdFF1YWxpdHkSHgoaUkVTVUxUX1FVQUxJVFlfVU5TUEVDSUZJRUQQABIbChdSRVNVTFRfUVVBTElUWV9WRVJJRklFRBABEhsKF1JFU1VMVF9RVUFMSVRZX0lORkVSUkVEEAISHAoYUkVTVUxUX1FVQUxJVFlfVU5DRVJUQUlOEAMqhgEKDFJlc3VsdFNvdXJjZRIdChlSRVNVTFRfU09VUkNFX1VOU1BFQ0lGSUVEEAASHQoZUkVTVUxUX1NPVVJDRV9UT09MX09VVFBVVBABEiEKHVJFU1VMVF9TT1VSQ0VfTU9ERUxfS05PV0xFREdFEAISFQoRUkVTVUxUX1NPVVJDRV9XRUIQAyqgAQoMQXJ0aWZhY3RUeXBlEh0KGUFSVElGQUNUX1RZUEVfVU5TUEVDSUZJRUQQABIWChJBUlRJRkFDVF9UWVBFX0NPREUQARIWChJBUlRJRkFDVF9UWVBFX1RFWFQQAhIgChxBUlRJRkFDVF9UWVBFX0NPTU1BTkRfT1VUUFVUEAMSHwobQVJUSUZBQ1RfVFlQRV9TRUFSQ0hfUkVTVUxUEARiBnByb3RvMw", [file_google_protobuf_timestamp]);
|
||||
|
||||
/**
|
||||
* A concrete output produced by an agent (code, command output, etc.).
|
||||
*
|
||||
* @generated from message llm_multiverse.v1.Artifact
|
||||
*/
|
||||
export type Artifact = Message<"llm_multiverse.v1.Artifact"> & {
|
||||
/**
|
||||
* Display name (filename, query, etc.)
|
||||
*
|
||||
* @generated from field: string label = 1;
|
||||
*/
|
||||
label: string;
|
||||
|
||||
/**
|
||||
* Full content
|
||||
*
|
||||
* @generated from field: string content = 2;
|
||||
*/
|
||||
content: string;
|
||||
|
||||
/**
|
||||
* @generated from field: llm_multiverse.v1.ArtifactType artifact_type = 3;
|
||||
*/
|
||||
artifactType: ArtifactType;
|
||||
|
||||
/**
|
||||
* language, path, tool_name, exit_code, etc.
|
||||
*
|
||||
* @generated from field: map<string, string> metadata = 4;
|
||||
*/
|
||||
metadata: { [key: string]: string };
|
||||
};
|
||||
|
||||
/**
|
||||
* Describes the message llm_multiverse.v1.Artifact.
|
||||
* Use `create(ArtifactSchema)` to create a new message.
|
||||
*/
|
||||
export const ArtifactSchema: GenMessage<Artifact> = /*@__PURE__*/
|
||||
messageDesc(file_llm_multiverse_v1_common, 0);
|
||||
|
||||
/**
|
||||
* Identifies a single agent in the lineage chain.
|
||||
@@ -41,7 +81,7 @@ export type AgentIdentifier = Message<"llm_multiverse.v1.AgentIdentifier"> & {
|
||||
* Use `create(AgentIdentifierSchema)` to create a new message.
|
||||
*/
|
||||
export const AgentIdentifierSchema: GenMessage<AgentIdentifier> = /*@__PURE__*/
|
||||
messageDesc(file_llm_multiverse_v1_common, 0);
|
||||
messageDesc(file_llm_multiverse_v1_common, 1);
|
||||
|
||||
/**
|
||||
* Ordered chain of agents from orchestrator (index 0) to current agent.
|
||||
@@ -61,7 +101,7 @@ export type AgentLineage = Message<"llm_multiverse.v1.AgentLineage"> & {
|
||||
* Use `create(AgentLineageSchema)` to create a new message.
|
||||
*/
|
||||
export const AgentLineageSchema: GenMessage<AgentLineage> = /*@__PURE__*/
|
||||
messageDesc(file_llm_multiverse_v1_common, 1);
|
||||
messageDesc(file_llm_multiverse_v1_common, 2);
|
||||
|
||||
/**
|
||||
* Carried in every gRPC request for audit trail and broker enforcement.
|
||||
@@ -100,7 +140,7 @@ export type SessionContext = Message<"llm_multiverse.v1.SessionContext"> & {
|
||||
* Use `create(SessionContextSchema)` to create a new message.
|
||||
*/
|
||||
export const SessionContextSchema: GenMessage<SessionContext> = /*@__PURE__*/
|
||||
messageDesc(file_llm_multiverse_v1_common, 2);
|
||||
messageDesc(file_llm_multiverse_v1_common, 3);
|
||||
|
||||
/**
|
||||
* Structured error detail for gRPC error responses.
|
||||
@@ -129,7 +169,7 @@ export type ErrorDetail = Message<"llm_multiverse.v1.ErrorDetail"> & {
|
||||
* Use `create(ErrorDetailSchema)` to create a new message.
|
||||
*/
|
||||
export const ErrorDetailSchema: GenMessage<ErrorDetail> = /*@__PURE__*/
|
||||
messageDesc(file_llm_multiverse_v1_common, 3);
|
||||
messageDesc(file_llm_multiverse_v1_common, 4);
|
||||
|
||||
/**
|
||||
* A candidate memory entry proposed by a subagent for persistence.
|
||||
@@ -158,7 +198,7 @@ export type MemoryCandidate = Message<"llm_multiverse.v1.MemoryCandidate"> & {
|
||||
* Use `create(MemoryCandidateSchema)` to create a new message.
|
||||
*/
|
||||
export const MemoryCandidateSchema: GenMessage<MemoryCandidate> = /*@__PURE__*/
|
||||
messageDesc(file_llm_multiverse_v1_common, 4);
|
||||
messageDesc(file_llm_multiverse_v1_common, 5);
|
||||
|
||||
/**
|
||||
* Standardized return value from any subagent to its parent.
|
||||
@@ -179,9 +219,11 @@ export type SubagentResult = Message<"llm_multiverse.v1.SubagentResult"> & {
|
||||
summary: string;
|
||||
|
||||
/**
|
||||
* @generated from field: repeated string artifacts = 3;
|
||||
* Structured artifacts produced during the agent loop.
|
||||
*
|
||||
* @generated from field: repeated llm_multiverse.v1.Artifact artifacts = 3;
|
||||
*/
|
||||
artifacts: string[];
|
||||
artifacts: Artifact[];
|
||||
|
||||
/**
|
||||
* @generated from field: llm_multiverse.v1.ResultQuality result_quality = 4;
|
||||
@@ -209,7 +251,7 @@ export type SubagentResult = Message<"llm_multiverse.v1.SubagentResult"> & {
|
||||
* Use `create(SubagentResultSchema)` to create a new message.
|
||||
*/
|
||||
export const SubagentResultSchema: GenMessage<SubagentResult> = /*@__PURE__*/
|
||||
messageDesc(file_llm_multiverse_v1_common, 5);
|
||||
messageDesc(file_llm_multiverse_v1_common, 6);
|
||||
|
||||
/**
|
||||
* Agent types with distinct tool permission manifests.
|
||||
@@ -450,3 +492,49 @@ export enum ResultSource {
|
||||
export const ResultSourceSchema: GenEnum<ResultSource> = /*@__PURE__*/
|
||||
enumDesc(file_llm_multiverse_v1_common, 5);
|
||||
|
||||
/**
|
||||
* Type of artifact produced by an agent during its tool call loop.
|
||||
*
|
||||
* @generated from enum llm_multiverse.v1.ArtifactType
|
||||
*/
|
||||
export enum ArtifactType {
|
||||
/**
|
||||
* @generated from enum value: ARTIFACT_TYPE_UNSPECIFIED = 0;
|
||||
*/
|
||||
UNSPECIFIED = 0,
|
||||
|
||||
/**
|
||||
* Code written via fs_write
|
||||
*
|
||||
* @generated from enum value: ARTIFACT_TYPE_CODE = 1;
|
||||
*/
|
||||
CODE = 1,
|
||||
|
||||
/**
|
||||
* Plain text / file content from fs_read
|
||||
*
|
||||
* @generated from enum value: ARTIFACT_TYPE_TEXT = 2;
|
||||
*/
|
||||
TEXT = 2,
|
||||
|
||||
/**
|
||||
* Output from run_code / run_shell
|
||||
*
|
||||
* @generated from enum value: ARTIFACT_TYPE_COMMAND_OUTPUT = 3;
|
||||
*/
|
||||
COMMAND_OUTPUT = 3,
|
||||
|
||||
/**
|
||||
* Web search results
|
||||
*
|
||||
* @generated from enum value: ARTIFACT_TYPE_SEARCH_RESULT = 4;
|
||||
*/
|
||||
SEARCH_RESULT = 4,
|
||||
}
|
||||
|
||||
/**
|
||||
* Describes the enum llm_multiverse.v1.ArtifactType.
|
||||
*/
|
||||
export const ArtifactTypeSchema: GenEnum<ArtifactType> = /*@__PURE__*/
|
||||
enumDesc(file_llm_multiverse_v1_common, 6);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user