Skip to content

Instantly share code, notes, and snippets.

@ssrihari
Created March 11, 2026 18:31
Show Gist options
  • Select an option

  • Save ssrihari/c2d86626e43bd51935ffd0034a20a083 to your computer and use it in GitHub Desktop.

Select an option

Save ssrihari/c2d86626e43bd51935ffd0034a20a083 to your computer and use it in GitHub Desktop.
Context Viewer Exporting analysing compaction
This file has been truncated, but you can view the full file.
{
"version": "1.0",
"exportedAt": "2026-03-11T18:20:17.794Z",
"files": [
{
"id": "d86f4b9f-221d-460e-9d9c-5b111b902919",
"filename": "segment-1.jsonl",
"title": "Pre Compaction S1",
"conversation": {
"messages": [
{
"id": "1",
"role": "user",
"timestamp": "2026-03-09T18:05:48.097Z",
"parts": [
{
"id": "2",
"type": "text",
"token_count": 50,
"component": "other",
"text": "<local-command-caveat>Caveat: The messages below were generated by the user while running local commands. DO NOT respond to these messages or otherwise consider them in your response unless the user explicitly asks you to.</local-command-caveat>"
}
]
},
{
"id": "3",
"role": "user",
"timestamp": "2026-03-09T18:05:48.090Z",
"parts": [
{
"id": "4",
"type": "text",
"token_count": 29,
"component": "other",
"text": "<command-name>/clear</command-name>\n <command-message>clear</command-message>\n <command-args></command-args>"
}
]
},
{
"id": "5",
"role": "user",
"timestamp": "2026-03-09T18:24:12.006Z",
"parts": [
{
"id": "6",
"type": "text",
"token_count": 403,
"component": "feature_design",
"text": "New feature. Allow multiple componentisations per conversation.\nCurrently, each segment can have only one component mapped to it.\nI want the ability to associate multiple components per segment.\n\nData model:\n- Each componentisation should have a \"dimension\" name. The first / default dimension name is \"default\".\n- So the mapping per segment isn't just a string anymore, it's a map of dimension name to component. like {default: foo, another: boo, yet_another: goo}\n- By default we only have one componentisation mechanism.\n- Adding a new dimension implies another name, another prompt. Editing prompts should work as it does now.\n\nLLM Calls:\n- We should be duplicating the calls for component mapping to the LLM, where each LLM call is still only about mapping one dimension at a time.\n- If we edit a prompt and re-run, it should rerun the pipeline for that dimension only.\n\nUI:\n- In the sidebar, when editing the componentisation prompt, allow changing the dimension name, or adding a new dimension. Make it an accordion, so I can switch between seeing dimensions.\n- I can view one or more dimensions at a time.\n- In the components view, there should be a drop-down where I can choose the dimension to view. I can also choose multiple dimensions to view, so, check box like the filter. This should also be there in the group comparison view, and in the single conversation components view.\n- For the waffle charts, the component and token % should be computed statically after componentisation is done.\n- For the colors, each dimension has its own color scheme. But when we visualise multiple dimensions together, it should also merge the colors, using rgb, etc. Have a simple pure function that returns the colors given the multiple components (and their colors). So A+B=> Orange, B+C=>Pink, etc.\n- When comparing The categories can be seen in the legend as multiple columns, with the dimension names as the headings.\n"
}
]
},
{
"id": "10",
"role": "assistant",
"timestamp": "2026-03-09T18:24:15.083Z",
"parts": [
{
"id": "7",
"type": "reasoning",
"token_count": 22,
"component": "understanding_codebase",
"text": "This is a large feature request. Let me start by understanding the current codebase structure before planning the implementation."
},
{
"id": "8",
"type": "text",
"token_count": 18,
"component": "understanding_codebase",
"text": "Let me explore the codebase to understand the current data model and architecture before planning this."
},
{
"id": "9",
"type": "tool-call",
"token_count": 201,
"component": "understanding_codebase",
"toolCallId": "toolu_017Adasz8wwosMhmQBLqeYJw",
"toolName": "Agent",
"input": {
"subagent_type": "Explore",
"description": "Explore codebase architecture",
"prompt": "Very thorough exploration of this codebase. I need to understand:\n\n1. The current data model - especially how segments and components are stored. Look for types/interfaces related to segments, components, componentisation.\n2. How the LLM calls work for component mapping - find the pipeline code.\n3. The UI structure - sidebar for editing prompts, components view, group comparison view, single conversation components view, waffle charts.\n4. How colors are assigned to components.\n5. How the prompt editing and re-running works.\n\nSearch for key files:\n- Type definitions (interfaces, types for segments, components, conversations)\n- The segmentation and componentisation pipeline code\n- UI components for the sidebar, components view, waffle charts\n- Color scheme logic\n- Prompt editing logic\n\nGive me file paths, key type definitions, and a summary of how everything connects."
}
}
]
},
{
"id": "11",
"role": "tool",
"timestamp": "2026-03-09T18:25:36.201Z",
"parts": [
{
"id": "12",
"type": "tool-result",
"token_count": 4466,
"component": "understanding_codebase",
"toolCallId": "toolu_017Adasz8wwosMhmQBLqeYJw",
"toolName": "Agent",
"output": [
{
"type": "text",
"text": "Perfect! Now I have a comprehensive understanding. Let me create a final summary document with all the key findings:\n\n## Comprehensive Codebase Analysis: Context Viewer\n\nI've completed a thorough exploration of the codebase. Here's the complete picture:\n\n---\n\n### **1. DATA MODEL**\n\n#### Core Types (Type Definitions)\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/schema.ts`\n\nThe data model is built on message-part architecture:\n\n```typescript\n// Message schema - discriminated union by role\ntype Message = SystemMessage | UserMessage | AssistantMessage | ToolMessage\n\n// Messages contain parts - discriminated union by type\ntype Message {\n id: string\n role: \"system\" | \"user\" | \"assistant\" | \"tool\"\n parts: MessagePart[] // Array of typed content parts\n timestamp?: string\n}\n\n// Part types (discriminated union)\ntype MessagePart = TextPart | FilePart | ImagePart | ReasoningPart | ToolCallPart | ToolResultPart\n - TextPart { id, type: \"text\", text, token_count? }\n - FilePart { id, type: \"file\", data, mediaType, filename? }\n - ImagePart { id, type: \"image\", image, mediaType? }\n - ReasoningPart { id, type: \"reasoning\", text, token_count? }\n - ToolCallPart { id, type: \"tool-call\", toolCallId, toolName, input, token_count? }\n - ToolResultPart { id, type: \"tool-result\", toolCallId, toolName, output, isError?, token_count? }\n\n// Conversation - just a collection of messages\ntype Conversation = {\n messages: Message[]\n}\n\n// Source info for grouped conversations\ntype SourceInfo = {\n conversationId: string\n filename: string\n title?: string\n}\n```\n\n#### Component Data Model\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts`\n\n```typescript\n// Timeline snapshot - component composition at each message\ninterface ComponentTimelineSnapshot {\n messageIndex: number\n componentTokens: Record<string, number> // component name → tokens\n totalTokens: number // cumulative tokens up to this message\n}\n\n// Component mapping\nRecord<string, string> // partId → componentName mapping\n```\n\n#### Workflow State Model\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/App.tsx` (lines 98-149)\n\n```typescript\ninterface WorkflowState {\n // Identity\n id: string\n filename: string\n title?: string\n\n // UI/Workflow lifecycle\n status: \"pending\" | \"processing\" | \"success\" | \"failed\" | \"paused-for-api-key\"\n step: ProcessingStep\n error?: string\n\n // Core data\n conversation?: Conversation\n summary?: ConversationSummary\n metadata?: ConversationMetadata\n aiSummary?: string\n analysis?: string\n\n // AI-based component data\n components?: string[]\n componentMapping?: Record<string, string>\n componentTimeline?: ComponentTimelineSnapshot[]\n componentColors?: Record<string, string>\n\n // Static component data (deterministic: role.partType)\n staticComponents?: string[]\n staticMapping?: Record<string, string>\n staticTimeline?: ComponentTimelineSnapshot[]\n\n // Grouped conversation data\n isGrouped?: boolean\n sourceConversations?: Array<{ id: string; filename: string }>\n messageSourceMap?: Record<string, SourceInfo> // messageId → source\n}\n```\n\n---\n\n### **2. LLM PIPELINE & COMPONENT MAPPING**\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts`\n\nThe pipeline has 2 main flows:\n\n#### **AI-Based Component Mapping (3 steps):**\n\n1. **identifyComponents()** (lines 87-146)\n - Input: Full conversation (stripped of binary data)\n - LLM Call: Gets list of component names\n - Output: `components: string[]`\n - Prompt: \"component-identification\" from prompts.ts\n\n2. **mapComponentsToIds()** (lines 258-308)\n - Input: Conversation + components list\n - Process: Batches parts in groups of 20 for parallel processing\n - LLM Call: Maps each part ID to a component\n - Output: `mapping: Record<string, string>` (partId → component)\n - Prompt: \"component-mapping\" from prompts.ts\n\n3. **buildComponentTimeline()** (lines 323-377)\n - Input: Conversation + component mapping\n - Process: Accumulates tokens per component up to each message\n - Output: `timeline: ComponentTimelineSnapshot[]`\n - No LLM call - deterministic calculation\n\n#### **Color Assignment:**\n\n**assignComponentColors()** (lines 383-466)\n- Input: Component names\n- If `presetColors` provided: Uses them directly\n- If not: LLM Call to assign semantic colors\n- Output: `Record<string, string>` (component → color)\n- Supports both color names (\"orange\", \"blue\") and hex codes\n\n#### **Main Integration:**\n\n**componentiseConversation()** (lines 472-558)\n- Orchestrates all 3 steps\n- Returns: `{ components, mapping, timeline, error? }`\n- Error handling for missing API keys\n\n---\n\n### **3. COMPLETE WORKFLOW PIPELINE**\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/App.tsx`\n\nProcessing occurs in a linear sequence with conditional steps:\n\n```\n1. PARSING (parseActivity, line 198)\n Input: File content\n Output: conversation, summary, metadata\n Parser: Automatically detected (Claude, Codex, OpenCode, SWE-Agent, etc.)\n\n2. TOKEN COUNTING (countTokensActivity, line 209)\n Input: conversation\n Output: conversation with token_count on each part\n Uses: encode() to count tokens\n\n3. STATIC COMPONENTISATION (staticComponentsActivity, line 220)\n Input: conversation\n Output: staticComponents, staticMapping, staticTimeline\n Deterministic: role.partType (e.g., \"user.text\", \"assistant.tool-call\")\n No LLM call\n\n4. SEGMENTATION [Optional] (segmentActivity, line 236)\n Input: conversation (large parts > threshold)\n Output: conversation with segmented parts\n Uses: LLM to split large text parts into semantic chunks\n Prompt: \"segmentation\" from prompts.ts\n\n5. FINDING COMPONENTS (findComponentsActivity, line 257)\n Input: conversation\n Output: components, mapping, timeline\n Uses: componentiseConversation() which calls AI 3 times\n\n6. COLORING (assignColorsActivity, line 282)\n Input: components\n Output: componentColors\n Uses: assignComponentColors() - may call AI\n\n7. SUMMARY [Optional] (createSummaryActivity, line 352)\n Input: conversation + metadata\n Output: aiSummary string\n Streaming: Chunks sent via callback\n Prompt: \"conversation-summary\" from prompts.ts\n\n8. ANALYSIS [Optional] (createAnalysisActivity, line 376)\n Input: conversation + components + timeline + summary\n Output: analysis string\n Streaming: Chunks sent via callback\n Prompt: \"context-analysis\" from prompts.ts\n```\n\n**Workflow Events** (enum WorkflowEvent):\n- `NewFile` - Start full pipeline for new file\n- `ComponentPromptChanged` - Re-identify/re-map components\n- `SegmentationPromptChanged` - Re-segment conversation\n- `SummaryPromptChanged` - Regenerate summary + analysis\n- `ColoringPromptChanged` - Re-assign colors\n- `ResumeFromApiKeyPause` - Resume from step 4\n\n---\n\n### **4. UI STRUCTURE**\n\n#### **Main Views**\n\n| Component | File | Purpose |\n|-----------|------|---------|\n| **ConversationView** | `src/components/ConversationView.tsx` | Main conversation display with tabs |\n| **ConversationList** | `src/components/ConversationList.tsx` | Sidebar listing all loaded conversations |\n| **ComponentsView** | `src/components/ComponentsView.tsx` | Single conversation: Timeline slider + Waffle chart + Workflow diagram |\n| **ComponentComparisonView** | `src/components/ComponentComparisonView.tsx` | Grouped conversations: Compare components across files |\n| **StackedBarChartView** | `src/components/StackedBarChartView.tsx` | Bar chart showing component token distribution |\n| **StaticComponentsView** | `src/components/StaticComponentsView.tsx` | Deterministic role.partType breakdown |\n| **WaffleChart** | `src/components/WaffleChart.tsx` | 20x20 grid visualization of component distribution |\n| **PromptEditorDialog** | `src/components/PromptEditorDialog.tsx` | Edit prompts for segmentation/components/colors/summary |\n\n#### **UI Tabs & Navigation**\n\n**ConversationView Tabs:**\n```\nSingle Conversation:\n - \"conversation\" - Message list with filtering\n - \"components\" - Timeline + Waffle chart + Workflow diagram\n - \"chart\" - Bar chart view\n\nGrouped Conversation (+ extra tab):\n - \"comparison\" - Compare component distribution across files\n```\n\n**Sidebar Controls:**\n- **ConversationList** - Select/remove conversations, edit titles\n- **Message Filters** - Filter by role:type (e.g., \"assistant:tool-call\")\n- **Component Filters** - Filter by selected components\n- **Search** - Full-text search in messages\n- **Sort Options** - time-asc, time-desc, tokens-asc, tokens-desc\n\n**Insights Panel (right):**\n- Toggle between Summary and Analysis tabs\n- Streaming text display as AI generates content\n- Collapsible panel\n\n---\n\n### **5. COLOR ASSIGNMENT SYSTEM**\n\n#### **AI-Based Colors** (Dynamic)\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts:383-466`\n\nWhen no preset provided:\n1. Call LLM with component names\n2. Returns: `{ \"componentName\": \"colorName\" }` or hex code\n3. Supports both:\n - Named colors: \"orange\", \"blue\", \"emerald\", \"purple\", \"indigo\", \"cyan\", \"teal\", \"rose\", \"amber\", \"violet\", \"lime\", \"sky\", \"slate\", \"gray\"\n - Hex codes: \"#fb923c\", \"#34d399\", etc.\n\n#### **Color Mapping Layers**\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/lib/component-colors.ts`\n\n```typescript\n// 4 color schemes for different UI elements:\ncolorNameToClasses // Tailwind badge classes (bg-orange-100 text-orange-700 etc.)\ncolorNameToBgClass // Tailwind background only (bg-orange-400 for waffle)\ncolorNameToHex // Light hex for chart backgrounds (#fed7aa)\ncolorNameToWaffleHex // Saturated hex for waffle (#fb923c) - 400/500 level\ncolorNameToTextHex // Dark hex for text labels (#c2410c)\n\n// Helper functions:\ngetComponentColorClasses() // Returns Tailwind or null\ngetComponentBadgeStyles() // Returns {classes, style}\ngetComponentColorHex() // Returns light hex\ngetComponentTextColorHex() // Returns dark hex\ngetComponentWaffleStyles() // Returns {classes, style} for waffle\ngetComponentWaffleHex() // Returns saturated hex\nhexToRgb() / rgbToHex() // Color space conversions\nlightenColor() / darkenColor() // Color manipulation\n```\n\n#### **Static Component Colors** (Fixed)\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/lib/static-component-colors.ts`\n\nPre-assigned by role:\n- `system.text` → blue-400\n- `user.text` → green-300, `user.image` → green-500, `user.file` → green-700\n- `assistant.text` → amber-300, `assistant.reasoning` → amber-400, `assistant.tool-call` → amber-600\n- `tool.tool-result` → purple-400\n\n---\n\n### **6. PROMPT EDITING & RE-RUNNING**\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/components/PromptEditorDialog.tsx` & `src/App.tsx`\n\n#### **Prompt Types** (5 editable)\n\n```typescript\ntype PromptKey = \n | \"segmentation\" // Split large text parts\n | \"conversation-summary\" // Generate AI summary\n | \"component-identification\" // Identify components\n | \"component-mapping\" // Map parts to components\n | \"component-coloring\" // Assign colors to components\n | \"context-analysis\" // Analyze context distribution\n```\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/prompts.ts`\n\n#### **Editing Flow**\n\n1. User clicks prompt edit button\n2. **PromptEditorDialog** opens with:\n - Current prompt text (in textarea)\n - Default prompt below\n - Warning message\n - \"Apply & Reprocess\" button\n - For segmentation: Token threshold slider\n\n3. User modifies prompt + clicks Apply\n\n4. **Workflow triggered** based on prompt type:\n - `customSegmentationPrompt` → Re-segment + re-count tokens + re-componentise\n - `customPrompt` (component) → Re-identify components + re-map\n - `customColoringPrompt` → Re-assign colors\n - `customSummaryPrompt` → Regenerate summary + (optionally) re-run analysis\n - `customAnalysisPrompt` → Regenerate analysis\n\n5. **State updated** in workflow:\n - Clears previous results for that step\n - Re-runs activity\n - Updates UI progressively\n\n#### **Default Prompts**\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/prompts.ts` (lines 150+)\n\n```typescript\ngetDefaultSegmentationPrompt()\ngetDefaultComponentIdentificationPrompt()\ngetDefaultColoringPrompt()\ngetDefaultSummaryPrompt()\ngetDefaultAnalysisPrompt()\n```\n\n---\n\n### **7. URL STATE MANAGEMENT**\n\n**Location:** `/Users/srihari/work/nilenso/context-viewer/src/lib/url-state.ts`\n\nPersists UI state in query parameters:\n\n```\nSingle conversation: /c/:conversationId/:tab?\nGrouped conversation: /g/:conversationId/:tab?\n\nQuery parameters (persist across tabs):\n msg=user:text,assistant:tool-call // Message type filters\n comp=planning,execution // Component filters\n insights=summary|analysis // Insights tab\n sidebar=0|1 // Sidebar collapsed\n panel=0|1 // Insights panel collapsed\n\nTab-specific (conversation tab):\n q=search // Search query\n sort=time-asc|time-desc|tokens-asc|tokens-desc\n\nTab-specific (comparison tab):\n view=tokens|workflow|tokens-absolute\n legend=expanded|compact\n sortBy=tokens|name|category\n sortDir=asc|desc\n cols=3\n spr=20 // Squares per row\n```\n\n**Hook:** `/Users/srihari/work/nilenso/context-viewer/src/hooks/useUrlState.ts`\n- Syncs React state ↔ URL\n- Handles browser back/forward\n- Preserves state on page reload\n\n---\n\n### **8. FILE STRUCTURE SUMMARY**\n\n```\nsrc/\n├── schema.ts # Core type definitions (Message, Conversation, etc.)\n├── input-schemas.ts # Input validation for different file formats\n├── segmentation.ts # Segment large text parts using AI\n├── componentisation.ts # Identify & map components (AI-based)\n├── static-componentisation.ts # Deterministic components (role.partType)\n├── prompts.ts # Centralized prompt management (6 prompt types)\n├── App.tsx (3070 lines) # Main React component + workflow orchestration\n├── parser.ts # File format detection\n├── parsers/ # Parsers for different log formats\n│ ├── claude-transcripts-parser.ts\n│ ├── codex-transcripts-parser.ts\n│ ├── opencode-transcripts-parser.ts\n│ ├── swe-agent-trajectory-parser.ts\n│ └── ... (6 total)\n├── components/\n│ ├── ConversationView.tsx # Main conversation view + tabs\n│ ├── ConversationList.tsx # Sidebar file list\n│ ├── ComponentsView.tsx # Timeline + waffle + workflow\n│ ├── ComponentComparisonView.tsx # Compare across files\n│ ├── StackedBarChartView.tsx # Bar chart\n│ ├── StaticComponentsView.tsx # role.partType breakdown\n│ ├── WaffleChart.tsx # 20x20 grid visualization\n│ ├── PromptEditorDialog.tsx # Edit & re-run prompts\n│ ├── MessageView.tsx # Message display\n│ └── ... (13 total)\n├── lib/\n│ ├── component-colors.ts # Color utilities (4 schemes)\n│ ├── static-component-colors.ts # Fixed role-based colors\n│ ├── url-state.ts # URL parsing/serialization\n│ ├── export-builder.ts # Build session exports\n│ ├── file-formats.ts # File type detection\n│ └── preset-loader.ts # Load component presets\n└── hooks/\n └── useUrlState.ts # URL ↔ React state sync\n```\n\n---\n\n### **KEY CONNECTION POINTS**\n\n1. **Data Flow:**\n ```\n File → Parser → Conversation (with token_count)\n → Static components (instant)\n → [Optional] Segmentation\n → [Optional] AI components (identify → map → timeline → colors)\n → [Optional] Summary + Analysis\n ```\n\n2. **Component Mapping:**\n - Each part has a unique ID\n - Part ID → Component Name mapping stored in state\n - Timeline shows cumulative component tokens per message\n - Colors applied via component name lookup\n\n3. **UI State:**\n - Controlled from URL (can be URL-driven or local)\n - Filters applied at display time (don't modify conversation)\n - Tab selection determines which visualization shown\n\n4. **Prompt Editing:**\n - Edit dialog captures custom prompt\n - Workflow triggered based on prompt type\n - Previous results cleared, re-run selected steps\n - Progressive UI updates via streaming callbacks\n\n5. **Multi-file Support:**\n - Each file = separate `WorkflowState`\n - Comparison view merges `ConversationComponentData` from multiple files\n - Grouped conversations have `messageSourceMap` for tracking origin\n\n---\n\n**All file paths are absolute paths in `/Users/srihari/work/nilenso/context-viewer/`**"
},
{
"type": "text",
"text": "agentId: a0666a0691dbce2f4 (for resuming to continue this agent's work if needed)\n<usage>total_tokens: 91570\ntool_uses: 26\nduration_ms: 75011</usage>"
}
]
}
]
},
{
"id": "18",
"role": "assistant",
"timestamp": "2026-03-09T18:25:39.065Z",
"parts": [
{
"id": "13",
"type": "reasoning",
"token_count": 29,
"component": "understanding_codebase",
"text": "This is a large feature. Let me plan the implementation carefully before writing code. Let me read the key files to understand the exact current state."
},
{
"id": "14",
"type": "text",
"token_count": 12,
"component": "understanding_codebase",
"text": "Now let me read the key files I'll need to modify."
},
{
"id": "15",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01TJfXtoVVRhqCjWgGtEfqUE",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 150,
"offset": 90
}
},
{
"id": "16",
"type": "tool-call",
"token_count": 22,
"component": "understanding_codebase",
"toolCallId": "toolu_019RP764JJf4g3rKNELF7GnW",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts"
}
},
{
"id": "17",
"type": "tool-call",
"token_count": 22,
"component": "understanding_codebase",
"toolCallId": "toolu_01PbmTCmUdGdCZL5TVDyAeqs",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/prompts.ts"
}
}
]
},
{
"id": "19",
"role": "tool",
"timestamp": "2026-03-09T18:25:40.640Z",
"parts": [
{
"id": "20",
"type": "tool-result",
"token_count": 1736,
"component": "understanding_codebase",
"toolCallId": "toolu_01TJfXtoVVRhqCjWgGtEfqUE",
"toolName": "Read",
"output": " 90→\n 91→/**\n 92→ * Represents workflow state for processing a conversation file.\n 93→ * Used both for React state management (persisting UI state) and during workflow execution (tracking progress).\n 94→ *\n 95→ * React uses: status, step, error, conversation, components, etc.\n 96→ * Workflow uses: file, config, customPrompt, plus all data fields\n 97→ */\n 98→interface WorkflowState {\n 99→ // Identity\n 100→ id: string;\n 101→ filename: string;\n 102→ title?: string; // Custom title, displays instead of filename when set\n 103→\n 104→ // UI/Workflow lifecycle (used by React)\n 105→ status?: ConversationStatus;\n 106→ step?: ProcessingStep;\n 107→ error?: string;\n 108→\n 109→ // Execution inputs (used during workflow execution)\n 110→ file?: File;\n 111→ config?: any;\n 112→ customPrompt?: string;\n 113→ customSegmentationPrompt?: string;\n 114→ customSummaryPrompt?: string;\n 115→ customAnalysisPrompt?: string;\n 116→ customColoringPrompt?: string;\n 117→ segmentationThreshold?: number;\n 118→ customComponents?: string[];\n 119→ regenerateAnalysis?: boolean;\n 120→ presetColors?: Record<string, string>;\n 121→\n 122→ // Core data\n 123→ conversation?: Conversation;\n 124→ summary?: ConversationSummary;\n 125→ metadata?: ConversationMetadata;\n 126→ aiSummary?: string;\n 127→ analysis?: string;\n 128→\n 129→ // Component data (automatic - AI-based)\n 130→ components?: string[];\n 131→ componentMapping?: Record<string, string>;\n 132→ componentTimeline?: ComponentTimelineSnapshot[];\n 133→ componentColors?: Record<string, string>;\n 134→\n 135→ // Static component data (deterministic - role.partType)\n 136→ staticComponents?: string[];\n 137→ staticMapping?: Record<string, string>;\n 138→ staticTimeline?: ComponentTimelineSnapshot[];\n 139→\n 140→ // Tracking\n 141→ warnings?: string[];\n 142→ stepTimings?: Partial<Record<ProcessingStep, number>>;\n 143→ pausedAtStep?: ProcessingStep;\n 144→\n 145→ // Grouped conversation data\n 146→ isGrouped?: boolean;\n 147→ sourceConversations?: Array<{ id: string; filename: string }>;\n 148→ messageSourceMap?: Record<string, SourceInfo>; // messageId -> source info\n 149→}\n 150→\n 151→interface WorkflowBatchResult {\n 152→ workflowStates: WorkflowState[];\n 153→}\n 154→\n 155→// ============================================================================\n 156→// Workflow Abstractions\n 157→// ============================================================================\n 158→\n 159→/**\n 160→ * Event types that trigger workflow execution\n 161→ */\n 162→enum WorkflowEvent {\n 163→ NewFile = \"new-file\",\n 164→ ComponentPromptChanged = \"component-prompt-changed\",\n 165→ SegmentationPromptChanged = \"segmentation-prompt-changed\",\n 166→ SummaryPromptChanged = \"summary-prompt-changed\",\n 167→ ColoringPromptChanged = \"coloring-prompt-changed\",\n 168→ GroupedConversation = \"grouped-conversation\",\n 169→ GenerateAnalysis = \"generate-analysis\",\n 170→ GenerateSummary = \"generate-summary\",\n 171→ ResumeFromApiKeyPause = \"resume-from-api-key-pause\",\n 172→}\n 173→\n 174→/**\n 175→ * Callbacks for streaming updates\n 176→ */\n 177→interface WorkflowCallbacks {\n 178→ onSummaryChunk?: (id: string, chunk: string) => void;\n 179→ onAnalysisChunk?: (id: string, chunk: string) => void;\n 180→}\n 181→\n 182→/**\n 183→ * Generic activity signature: takes readonly context, returns typed result\n 184→ */\n 185→type Activity<TResult> = (ctx: Readonly<WorkflowState>) => Promise<TResult>;\n 186→\n 187→// ============================================================================\n 188→// Activity Definitions\n 189→// ============================================================================\n 190→\n 191→/**\n 192→ * Parse activity: Parse file into conversation and generate summary\n 193→ */\n 194→const parseActivity: Activity<{\n 195→ conversation: Conversation;\n 196→ summary: ConversationSummary;\n 197→ metadata: ConversationMetadata;\n 198→}> = async (ctx) => {\n 199→ const text = await ctx.file!.text();\n 200→ const data = parseFileContent(text, ctx.file!.name);\n 201→ const { conversation, metadata } = parserRegistry.parseWithMetadata(data);\n 202→ const summary = summarizeConversation(conversation);\n 203→ return { conversation, summary, metadata };\n 204→};\n 205→\n 206→/**\n 207→ * Token counting activity: Add token counts to conversation\n 208→ */\n 209→const countTokensActivity: Activity<{\n 210→ conversation: Conversation;\n 211→}> = async (ctx) => {\n 212→ const conversation = await addTokenCounts(ctx.conversation!);\n 213→ return { conversation };\n 214→};\n 215→\n 216→/**\n 217→ * Static componentisation activity: Deterministic component identification\n 218→ * based on role.partType (e.g., \"user.text\", \"assistant.tool-call\")\n 219→ */\n 220→const staticComponentsActivity: Activity<{\n 221→ staticComponents: string[];\n 222→ staticMapping: Record<string, string>;\n 223→ staticTimeline: ComponentTimelineSnapshot[];\n 224→}> = async (ctx) => {\n 225→ const result = staticComponentise(ctx.conversation!);\n 226→ return {\n 227→ staticComponents: result.components,\n 228→ staticMapping: result.mapping,\n 229→ staticTimeline: result.timeline,\n 230→ };\n 231→};\n 232→\n 233→/**\n 234→ * Segmentation activity: Segment large parts in conversation\n 235→ */\n 236→const segmentActivity: Activity<{\n 237→ conversation: Conversation;\n 238→ error?: string;\n 239→}> = async (ctx) => {"
}
]
},
{
"id": "21",
"role": "tool",
"timestamp": "2026-03-09T18:25:41.141Z",
"parts": [
{
"id": "22",
"type": "tool-result",
"token_count": 6643,
"component": "understanding_codebase",
"toolCallId": "toolu_019RP764JJf4g3rKNELF7GnW",
"toolName": "Read",
"output": " 1→import { generateText } from \"ai\";\n 2→import { createOpenAI } from \"@ai-sdk/openai\";\n 3→import type { Conversation } from \"./schema\";\n 4→import { getPrompt, getDefaultComponentIdentificationPrompt } from \"./prompts\";\n 5→import { stripLargeContent } from \"./strip-large-content\";\n 6→import { getAIConfig, type AIConfig } from \"./ai-config\";\n 7→import { workflowLog, type ProcessingPhase } from \"./workflow-logger\";\n 8→\n 9→// Helper to log with optional conversation context\n 10→function log(\n 11→ conversationId: string | undefined,\n 12→ message: string,\n 13→ data?: unknown,\n 14→) {\n 15→ if (conversationId) {\n 16→ workflowLog(\n 17→ conversationId,\n 18→ \"finding-components\" as ProcessingPhase,\n 19→ \"info\",\n 20→ message,\n 21→ data,\n 22→ );\n 23→ } else {\n 24→ if (data !== undefined) {\n 25→ console.log(`[Componentisation] ${message}`, data);\n 26→ } else {\n 27→ console.log(`[Componentisation] ${message}`);\n 28→ }\n 29→ }\n 30→}\n 31→\n 32→function logError(\n 33→ conversationId: string | undefined,\n 34→ message: string,\n 35→ data?: unknown,\n 36→) {\n 37→ if (conversationId) {\n 38→ workflowLog(\n 39→ conversationId,\n 40→ \"finding-components\" as ProcessingPhase,\n 41→ \"error\",\n 42→ message,\n 43→ data,\n 44→ );\n 45→ } else {\n 46→ console.error(`[Componentisation] ${message}`, data);\n 47→ }\n 48→}\n 49→\n 50→function logColoring(\n 51→ conversationId: string | undefined,\n 52→ message: string,\n 53→ data?: unknown,\n 54→) {\n 55→ if (conversationId) {\n 56→ workflowLog(\n 57→ conversationId,\n 58→ \"coloring\" as ProcessingPhase,\n 59→ \"info\",\n 60→ message,\n 61→ data,\n 62→ );\n 63→ } else {\n 64→ if (data !== undefined) {\n 65→ console.log(`[Coloring] ${message}`, data);\n 66→ } else {\n 67→ console.log(`[Coloring] ${message}`);\n 68→ }\n 69→ }\n 70→}\n 71→\n 72→/**\n 73→ * Configuration for AI model used in componentisation\n 74→ * Re-exported for backwards compatibility\n 75→ */\n 76→export type ComponentisationConfig = AIConfig;\n 77→\n 78→/**\n 79→ * Get componentisation configuration from environment variables\n 80→ */\n 81→export const getComponentisationConfig = () => getAIConfig(\"Componentisation\");\n 82→\n 83→/**\n 84→ * Identify components in a conversation using AI\n 85→ * Returns a list of component names\n 86→ */\n 87→export async function identifyComponents(\n 88→ conversation: Conversation,\n 89→ config: ComponentisationConfig,\n 90→ customPrompt?: string,\n 91→ conversationId?: string,\n 92→): Promise<string[]> {\n 93→ const openai = createOpenAI({\n 94→ apiKey: config.apiKey,\n 95→ });\n 96→\n 97→ // Strip binary data to reduce token count\n 98→ const strippedConversation = stripLargeContent(conversation);\n 99→ const conversationJson = JSON.stringify(strippedConversation, null, 2);\n 100→\n 101→ log(\n 102→ conversationId,\n 103→ `Calling AI to identify components (model: ${config.model})${customPrompt ? \" with custom prompt\" : \"\"}`,\n 104→ );\n 105→\n 106→ const prompt = getPrompt(\"component-identification\", {\n 107→ conversationJson,\n 108→ customPrompt,\n 109→ });\n 110→\n 111→ try {\n 112→ const result = await generateText({\n 113→ model: openai(config.model),\n 114→ prompt,\n 115→ });\n 116→\n 117→ log(\n 118→ conversationId,\n 119→ `AI response for components: ${result.text.substring(0, 200)}...`,\n 120→ );\n 121→\n 122→ // Parse the JSON response\n 123→ const jsonMatch = result.text.match(/\\[.*\\]/s);\n 124→ if (!jsonMatch) {\n 125→ log(conversationId, \"No JSON array found in response\");\n 126→ return [];\n 127→ }\n 128→\n 129→ const components = JSON.parse(jsonMatch[0]);\n 130→\n 131→ if (!Array.isArray(components)) {\n 132→ log(conversationId, \"Parsed result is not an array\");\n 133→ return [];\n 134→ }\n 135→\n 136→ log(\n 137→ conversationId,\n 138→ `Identified ${components.length} components`,\n 139→ components,\n 140→ );\n 141→ return components;\n 142→ } catch (error) {\n 143→ logError(conversationId, \"Error calling AI for components\", error);\n 144→ return [];\n 145→ }\n 146→}\n 147→\n 148→/**\n 149→ * Extract all parts from a conversation with their context\n 150→ */\n 151→interface PartWithContext {\n 152→ partId: string;\n 153→ messageIndex: number;\n 154→ role: string;\n 155→ partType: string;\n 156→ content: unknown;\n 157→}\n 158→\n 159→function extractPartsWithContext(\n 160→ conversation: Conversation,\n 161→): PartWithContext[] {\n 162→ const parts: PartWithContext[] = [];\n 163→\n 164→ conversation.messages.forEach((message, messageIndex) => {\n 165→ message.parts.forEach((part) => {\n 166→ let content: unknown;\n 167→\n 168→ // Extract relevant content based on part type\n 169→ if (part.type === \"text\" || part.type === \"reasoning\") {\n 170→ content = part.text;\n 171→ } else if (part.type === \"tool-call\") {\n 172→ content = { toolName: part.toolName, input: part.input };\n 173→ } else if (part.type === \"tool-result\") {\n 174→ content = { toolName: part.toolName, output: part.output };\n 175→ } else if (part.type === \"image\") {\n 176→ content = \"[IMAGE]\";\n 177→ } else if (part.type === \"file\") {\n 178→ content = \"[FILE]\";\n 179→ }\n 180→\n 181→ parts.push({\n 182→ partId: part.id,\n 183→ messageIndex,\n 184→ role: message.role,\n 185→ partType: part.type,\n 186→ content,\n 187→ });\n 188→ });\n 189→ });\n 190→\n 191→ return parts;\n 192→}\n 193→\n 194→/**\n 195→ * Map a batch of parts to components using AI\n 196→ */\n 197→async function mapPartsBatch(\n 198→ parts: PartWithContext[],\n 199→ components: string[],\n 200→ config: ComponentisationConfig,\n 201→ componentDescriptions?: string,\n 202→ conversationId?: string,\n 203→): Promise<Record<string, string>> {\n 204→ const openai = createOpenAI({\n 205→ apiKey: config.apiKey,\n 206→ });\n 207→\n 208→ // Create a simplified conversation structure for just these parts\n 209→ const partsJson = JSON.stringify(parts, null, 2);\n 210→ const componentsJson = JSON.stringify(components, null, 2);\n 211→\n 212→ const prompt = getPrompt(\"component-mapping\", {\n 213→ conversationJson: partsJson,\n 214→ componentsJson,\n 215→ componentDescriptions: componentDescriptions || \"\",\n 216→ });\n 217→\n 218→ try {\n 219→ const result = await generateText({\n 220→ model: openai(config.model),\n 221→ prompt,\n 222→ });\n 223→\n 224→ // Parse the JSON response\n 225→ const jsonMatch = result.text.match(/\\{[^]*\\}/s);\n 226→ if (!jsonMatch) {\n 227→ log(conversationId, \"No JSON object found in batch response\");\n 228→ return {};\n 229→ }\n 230→\n 231→ const rawMapping = JSON.parse(jsonMatch[0]);\n 232→\n 233→ if (typeof rawMapping !== \"object\" || rawMapping === null) {\n 234→ log(conversationId, \"Parsed batch result is not an object\");\n 235→ return {};\n 236→ }\n 237→\n 238→ // Normalize component names - strip leading \"- \" that AI might add\n 239→ const mapping: Record<string, string> = {};\n 240→ for (const [key, value] of Object.entries(rawMapping)) {\n 241→ if (typeof value === \"string\") {\n 242→ mapping[key] = value.replace(/^-\\s*/, \"\");\n 243→ }\n 244→ }\n 245→\n 246→ return mapping;\n 247→ } catch (error) {\n 248→ logError(conversationId, \"Error calling AI for batch mapping\", error);\n 249→ return {};\n 250→ }\n 251→}\n 252→\n 253→/**\n 254→ * Map message IDs to components using AI\n 255→ * Processes parts in batches of 20 in parallel for better coverage\n 256→ * Returns an object mapping message part IDs to component names\n 257→ */\n 258→export async function mapComponentsToIds(\n 259→ conversation: Conversation,\n 260→ components: string[],\n 261→ config: ComponentisationConfig,\n 262→ componentDescriptions?: string,\n 263→ conversationId?: string,\n 264→): Promise<Record<string, string>> {\n 265→ const BATCH_SIZE = 20;\n 266→\n 267→ // Strip binary data and extract parts with context\n 268→ const strippedConversation = stripLargeContent(conversation);\n 269→ const allParts = extractPartsWithContext(strippedConversation);\n 270→\n 271→ log(\n 272→ conversationId,\n 273→ `Mapping ${allParts.length} parts in batches of ${BATCH_SIZE} (model: ${config.model})`,\n 274→ );\n 275→\n 276→ // Split parts into batches\n 277→ const batches: PartWithContext[][] = [];\n 278→ for (let i = 0; i < allParts.length; i += BATCH_SIZE) {\n 279→ batches.push(allParts.slice(i, i + BATCH_SIZE));\n 280→ }\n 281→\n 282→ log(conversationId, `Processing ${batches.length} batches in parallel`);\n 283→\n 284→ // Process all batches in parallel\n 285→ const batchResults = await Promise.all(\n 286→ batches.map((batch, index) => {\n 287→ log(\n 288→ conversationId,\n 289→ `Starting batch ${index + 1}/${batches.length} (${batch.length} parts)`,\n 290→ );\n 291→ return mapPartsBatch(batch, components, config, componentDescriptions, conversationId);\n 292→ }),\n 293→ );\n 294→\n 295→ // Merge all batch results into a single mapping\n 296→ const mergedMapping: Record<string, string> = {};\n 297→ batchResults.forEach((batchMapping, index) => {\n 298→ const entriesCount = Object.keys(batchMapping).length;\n 299→ log(conversationId, `Batch ${index + 1} returned ${entriesCount} mappings`);\n 300→ Object.assign(mergedMapping, batchMapping);\n 301→ });\n 302→\n 303→ log(\n 304→ conversationId,\n 305→ `Created merged mapping with ${Object.keys(mergedMapping).length} entries (from ${allParts.length} parts)`,\n 306→ );\n 307→ return mergedMapping;\n 308→}\n 309→\n 310→/**\n 311→ * Timeline snapshot representing component composition at a specific message\n 312→ */\n 313→export interface ComponentTimelineSnapshot {\n 314→ messageIndex: number;\n 315→ componentTokens: Record<string, number>; // component name → total tokens\n 316→ totalTokens: number; // cumulative tokens up to this message\n 317→}\n 318→\n 319→/**\n 320→ * Build a timeline of component composition for each message in the conversation\n 321→ * This allows scrubbing through the conversation to see how components evolve\n 322→ */\n 323→export function buildComponentTimeline(\n 324→ conversation: Conversation,\n 325→ componentMapping: Record<string, string>,\n 326→ conversationId?: string,\n 327→): ComponentTimelineSnapshot[] {\n 328→ log(conversationId, \"Building component timeline\");\n 329→\n 330→ // Build a map of part ID to its message index and token count\n 331→ const partInfo = new Map<\n 332→ string,\n 333→ { messageIndex: number; tokenCount: number }\n 334→ >();\n 335→ conversation.messages.forEach((message, messageIndex) => {\n 336→ message.parts.forEach((part) => {\n 337→ const tokenCount = (\"token_count\" in part && part.token_count) || 0;\n 338→ partInfo.set(part.id, { messageIndex, tokenCount });\n 339→ });\n 340→ });\n 341→\n 342→ // Log mapping coverage for debugging\n 343→ const mappedCount = Object.keys(componentMapping).length;\n 344→ const totalParts = partInfo.size;\n 345→ log(\n 346→ conversationId,\n 347→ `Mapping coverage: ${mappedCount}/${totalParts} parts (${Math.round((mappedCount / totalParts) * 100)}%)`,\n 348→ );\n 349→\n 350→ // Build timeline snapshots\n 351→ const timeline: ComponentTimelineSnapshot[] = [];\n 352→\n 353→ for (let msgIndex = 0; msgIndex < conversation.messages.length; msgIndex++) {\n 354→ const componentTokens: Record<string, number> = {};\n 355→ let totalTokens = 0;\n 356→\n 357→ // Accumulate tokens for ALL parts up to and including this message\n 358→ // Use mapping if available, otherwise assign to \"other\"\n 359→ partInfo.forEach((info, partId) => {\n 360→ if (info.messageIndex <= msgIndex) {\n 361→ const component = componentMapping[partId] || \"other\";\n 362→ componentTokens[component] =\n 363→ (componentTokens[component] || 0) + info.tokenCount;\n 364→ totalTokens += info.tokenCount;\n 365→ }\n 366→ });\n 367→\n 368→ timeline.push({\n 369→ messageIndex: msgIndex,\n 370→ componentTokens,\n 371→ totalTokens,\n 372→ });\n 373→ }\n 374→\n 375→ log(conversationId, `Built timeline with ${timeline.length} snapshots`);\n 376→ return timeline;\n 377→}\n 378→\n 379→/**\n 380→ * Assign colors to components based on preset or AI\n 381→ * Returns an object mapping component names to color names\n 382→ */\n 383→export async function assignComponentColors(\n 384→ components: string[],\n 385→ config: ComponentisationConfig,\n 386→ conversationId?: string,\n 387→ presetColors?: Record<string, string>,\n 388→ customColoringPrompt?: string,\n 389→): Promise<Record<string, string>> {\n 390→ // If preset colors are provided, use them directly\n 391→ if (presetColors) {\n 392→ const colorMapping: Record<string, string> = {};\n 393→ for (const component of components) {\n 394→ colorMapping[component] = presetColors[component] || \"gray\";\n 395→ }\n 396→ logColoring(\n 397→ conversationId,\n 398→ `Using preset colors for ${Object.keys(colorMapping).length} components`,\n 399→ );\n 400→ return colorMapping;\n 401→ }\n 402→\n 403→ // AI-based color assignment\n 404→ const openai = createOpenAI({\n 405→ apiKey: config.apiKey,\n 406→ });\n 407→\n 408→ const componentsJson = JSON.stringify(components, null, 2);\n 409→\n 410→ console.log(\n 411→ `[Componentisation] Calling AI to assign colors (model: ${config.model})`,\n 412→ );\n 413→\n 414→ const prompt = getPrompt(\"component-coloring\", { componentsJson, customPrompt: customColoringPrompt });\n 415→\n 416→ try {\n 417→ const result = await generateText({\n 418→ model: openai(config.model),\n 419→ prompt,\n 420→ });\n 421→\n 422→ console.log(`[Componentisation] AI response for colors: ${result.text}`);\n 423→\n 424→ // Parse the JSON response\n 425→ const jsonMatch = result.text.match(/\\{[^]*\\}/s);\n 426→ if (!jsonMatch) {\n 427→ console.log(\"[Componentisation] No JSON object found in response\");\n 428→ return {};\n 429→ }\n 430→\n 431→ const rawColorMapping = JSON.parse(jsonMatch[0]);\n 432→\n 433→ if (typeof rawColorMapping !== \"object\" || rawColorMapping === null) {\n 434→ console.log(\"[Componentisation] Parsed result is not an object\");\n 435→ return {};\n 436→ }\n 437→\n 438→ // Clean up keys - handle various AI response formats:\n 439→ // - Remove leading \"- \" that AI might add\n 440→ // - Extract component name from \"name: description\" format (some models include descriptions)\n 441→ const colorMapping: Record<string, string> = {};\n 442→ for (const [key, value] of Object.entries(rawColorMapping)) {\n 443→ let cleanKey = key.replace(/^-\\s*/, \"\");\n 444→\n 445→ // If the key contains \": \" followed by a description, extract just the component name\n 446→ // e.g., \"identity: Establishes who the AI is...\" -> \"identity\"\n 447→ // But preserve dots in component names like \"personality.guidelines\"\n 448→ const colonDescIndex = cleanKey.indexOf(\": \");\n 449→ if (colonDescIndex > 0) {\n 450→ cleanKey = cleanKey.substring(0, colonDescIndex);\n 451→ }\n 452→\n 453→ if (typeof value === \"string\") {\n 454→ colorMapping[cleanKey] = value;\n 455→ }\n 456→ }\n 457→\n 458→ console.log(\n 459→ `[Componentisation] Assigned colors to ${Object.keys(colorMapping).length} components`,\n 460→ );\n 461→ return colorMapping;\n 462→ } catch (error) {\n 463→ console.error(\"[Componentisation] Error calling AI for colors:\", error);\n 464→ return {};\n 465→ }\n 466→}\n 467→\n 468→/**\n 469→ * Componentise a conversation: identify components and map them to message IDs\n 470→ * Returns the list of components, the mapping, timeline data, and error info\n 471→ */\n 472→export async function componentiseConversation(\n 473→ conversation: Conversation,\n 474→ onProgress?: (step: \"identifying\" | \"mapping\") => void,\n 475→ customPrompt?: string,\n 476→ customComponents?: string[],\n 477→ conversationId?: string,\n 478→): Promise<{\n 479→ components: string[];\n 480→ mapping: Record<string, string>;\n 481→ timeline: ComponentTimelineSnapshot[];\n 482→ error?: string;\n 483→}> {\n 484→ log(conversationId, \"Starting componentisation process\");\n 485→\n 486→ const config = getComponentisationConfig();\n 487→\n 488→ if (!config) {\n 489→ log(conversationId, \"No config, skipping componentisation\");\n 490→ return {\n 491→ components: [],\n 492→ mapping: {},\n 493→ timeline: [],\n 494→ error: \"Componentisation: No API key configured\",\n 495→ };\n 496→ }\n 497→\n 498→ // Step 1: Identify components (or use custom components if provided)\n 499→ let components: string[];\n 500→ if (customComponents && customComponents.length > 0) {\n 501→ // Normalize custom components - strip leading \"- \" prefix\n 502→ components = customComponents.map((c) => c.replace(/^-\\s*/, \"\"));\n 503→ log(\n 504→ conversationId,\n 505→ `Using ${components.length} custom components (normalized)`,\n 506→ );\n 507→ } else {\n 508→ onProgress?.(\"identifying\");\n 509→ components = await identifyComponents(\n 510→ conversation,\n 511→ config,\n 512→ customPrompt,\n 513→ conversationId,\n 514→ );\n 515→\n 516→ if (components.length === 0) {\n 517→ log(conversationId, \"No components identified\");\n 518→ return {\n 519→ components: [],\n 520→ mapping: {},\n 521→ timeline: [],\n 522→ error: \"Componentisation: Failed to identify components (API error)\",\n 523→ };\n 524→ }\n 525→ }\n 526→\n 527→ // Step 2: Map components to IDs\n 528→ onProgress?.(\"mapping\");\n 529→ const componentDescriptions = customPrompt || getDefaultComponentIdentificationPrompt();\n 530→ const mapping = await mapComponentsToIds(\n 531→ conversation,\n 532→ components,\n 533→ config,\n 534→ componentDescriptions,\n 535→ conversationId,\n 536→ );\n 537→\n 538→ // Check if there are unmapped parts and add \"other\" component if needed\n 539→ const totalParts = conversation.messages.reduce(\n 540→ (sum, msg) => sum + msg.parts.length,\n 541→ 0,\n 542→ );\n 543→ const mappedParts = Object.keys(mapping).length;\n 544→ const finalComponents =\n 545→ mappedParts < totalParts && !components.includes(\"other\")\n 546→ ? [...components, \"other\"]\n 547→ : components;\n 548→\n 549→ // Step 3: Build timeline\n 550→ const timeline = buildComponentTimeline(\n 551→ conversation,\n 552→ mapping,\n 553→ conversationId,\n 554→ );\n 555→\n 556→ log(conversationId, \"Completed componentisation\");\n 557→ return { components: finalComponents, mapping, timeline };\n 558→}\n 559→"
}
]
},
{
"id": "23",
"role": "tool",
"timestamp": "2026-03-09T18:25:41.225Z",
"parts": [
{
"id": "24",
"type": "tool-result",
"token_count": 4359,
"component": "understanding_codebase",
"toolCallId": "toolu_01PbmTCmUdGdCZL5TVDyAeqs",
"toolName": "Read",
"output": " 1→/**\n 2→ * Centralized prompt management\n 3→ * All AI prompts used throughout the application\n 4→ */\n 5→\n 6→export type PromptKey =\n 7→ | \"segmentation\"\n 8→ | \"conversation-summary\"\n 9→ | \"component-identification\"\n 10→ | \"component-mapping\"\n 11→ | \"component-coloring\"\n 12→ | \"context-analysis\";\n 13→\n 14→interface PromptTemplate {\n 15→ key: PromptKey;\n 16→ template: (variables: Record<string, any>) => string;\n 17→ description: string;\n 18→}\n 19→\n 20→const prompts: Record<PromptKey, PromptTemplate> = {\n 21→ segmentation: {\n 22→ key: \"segmentation\",\n 23→ description: \"Segments large text parts into semantic sections\",\n 24→ template: ({ text, customPrompt }) => {\n 25→ const userPrompt = customPrompt || getDefaultSegmentationPrompt();\n 26→ return `${userPrompt}\n 27→\n 28→\\`\\`\\`\n 29→${text}\n 30→\\`\\`\\`\n 31→`;\n 32→ },\n 33→ },\n 34→\n 35→ \"conversation-summary\": {\n 36→ key: \"conversation-summary\",\n 37→ description: \"Generates a high-level summary of the entire conversation\",\n 38→ template: ({ conversationOverview, customPrompt, metadata, stats }) => {\n 39→ const userPrompt = customPrompt || getDefaultSummaryPrompt();\n 40→\n 41→ // Build metadata section if available\n 42→ let metadataSection = \"\";\n 43→ if (metadata || stats) {\n 44→ const lines: string[] = [];\n 45→ if (metadata?.parserName) lines.push(`Format: ${metadata.parserName}`);\n 46→ if (metadata?.agent) lines.push(`Agent: ${metadata.agent}`);\n 47→ if (metadata?.model) lines.push(`Model: ${metadata.model}`);\n 48→ if (stats?.messageCount) lines.push(`Messages: ${stats.messageCount}`);\n 49→ if (stats?.turnCount) lines.push(`Turns: ${stats.turnCount}`);\n 50→ if (stats?.durationMs) {\n 51→ const seconds = Math.floor(stats.durationMs / 1000);\n 52→ const minutes = Math.floor(seconds / 60);\n 53→ const remainingSeconds = seconds % 60;\n 54→ lines.push(`Duration: ${minutes}m ${remainingSeconds}s`);\n 55→ }\n 56→ if (lines.length > 0) {\n 57→ metadataSection = `\\n\\nConversation Metadata:\\n${lines.join(\"\\n\")}\\n`;\n 58→ }\n 59→ }\n 60→\n 61→ return `${userPrompt}${metadataSection}\n 62→\n 63→Conversation:\n 64→${JSON.stringify(conversationOverview, null, 2)}`;\n 65→ },\n 66→ },\n 67→\n 68→ \"component-identification\": {\n 69→ key: \"component-identification\",\n 70→ description: \"Identifies components in a conversation for categorization\",\n 71→ template: ({ conversationJson, customPrompt }) => {\n 72→ const userPrompt = customPrompt || getDefaultComponentIdentificationPrompt();\n 73→ const outputFormat = `\\n\\njust give me a list in a json array like this example:\\n[\"abc_document\", \"xyz_structure\", \"foo_context\", \"task\", \"sources\", \"breakdown\", \"reflection\", \"files_about_bar\", \"files_about_baz\", \"tool_calls_about_quix\", \"xyz blocks\", \"pqr list\"]`;\n 74→\n 75→ return `${userPrompt}${outputFormat}\\n\\n<conversation>${conversationJson}</conversation>`;\n 76→ },\n 77→ },\n 78→\n 79→ \"component-mapping\": {\n 80→ key: \"component-mapping\",\n 81→ description: \"Maps message part IDs to identified components\",\n 82→ template: ({ conversationJson, componentsJson, componentDescriptions }) => `given this conversation and the list of components, give me a mapping\n 83→of message part ids in the conversation, to a component from the list, for all the message parts\n 84→just give me a simple json object {id: component}\n 85→\n 86→<component-descriptions>${componentDescriptions}</component-descriptions>\n 87→<conversation>${conversationJson}</conversation>\n 88→<components>${componentsJson}</components>`,\n 89→ },\n 90→\n 91→ \"component-coloring\": {\n 92→ key: \"component-coloring\",\n 93→ description: \"Assigns colors to components based on similarity\",\n 94→ template: ({ componentsJson, customPrompt }) => {\n 95→ const userPrompt = customPrompt || getDefaultColoringPrompt();\n 96→ return `${userPrompt}\n 97→\n 98→Components:\n 99→${componentsJson}`;\n 100→ },\n 101→ },\n 102→\n 103→ \"context-analysis\": {\n 104→ key: \"context-analysis\",\n 105→ description: \"Analyzes conversation context to find opportunities for improvement\",\n 106→ template: ({ conversationSummary, componentDataCSV, customPrompt }) => {\n 107→ const userPrompt = customPrompt || getDefaultAnalysisPrompt();\n 108→ return `${userPrompt}\n 109→\n 110→## Conversation Summary\n 111→${conversationSummary}\n 112→\n 113→## Component Distribution Over Time (CSV)\n 114→This shows how different context components grew throughout the conversation:\n 115→\n 116→${componentDataCSV}`;\n 117→ },\n 118→ },\n 119→};\n 120→\n 121→/**\n 122→ * Get a prompt by key with variable substitution\n 123→ */\n 124→export function getPrompt(\n 125→ key: PromptKey,\n 126→ variables: Record<string, any>\n 127→): string {\n 128→ const promptTemplate = prompts[key];\n 129→ if (!promptTemplate) {\n 130→ throw new Error(`Prompt not found: ${key}`);\n 131→ }\n 132→ return promptTemplate.template(variables);\n 133→}\n 134→\n 135→/**\n 136→ * Get prompt description\n 137→ */\n 138→export function getPromptDescription(key: PromptKey): string {\n 139→ const promptTemplate = prompts[key];\n 140→ if (!promptTemplate) {\n 141→ throw new Error(`Prompt not found: ${key}`);\n 142→ }\n 143→ return promptTemplate.description;\n 144→}\n 145→\n 146→/**\n 147→ * Get all available prompt keys\n 148→ */\n 149→export function getAllPromptKeys(): PromptKey[] {\n 150→ return Object.keys(prompts) as PromptKey[];\n 151→}\n 152→\n 153→/**\n 154→ * Get the default (user-editable) component identification prompt\n 155→ * This is the part shown in the UI without the output format specification\n 156→ */\n 157→export function getDefaultComponentIdentificationPrompt(): string {\n 158→ return `\n 159→- identity: Establishes who the AI is, its name, role, and fundamental nature. Defines the relationship between the AI and the user (assistant, partner, tool). Sets the foundation for all subsequent behavioral instructions.\n 160→\n 161→- personality: Governs how the AI communicates, behaves, and presents itself. Covers tone, interaction style, autonomy boundaries, and explicit behavioral constraints that shape the user experience.\n 162→- personality.guidelines: General principles for interaction style and response formatting.\n 163→- personality.behavior: Constraints on decision-making like avoiding assumptions, not over-engineering, completing tasks fully.\n 164→- personality.communication: Output formatting rules including emoji usage, conciseness, reasoning transparency, markdown conventions.\n 165→- personality.autonomy: How much independent action the AI can take versus requiring user approval or confirmation.\n 166→- personality.model_steering: Emphatic instructions using caps, repetition, and specific prohibitions to override model defaults.\n 167→- personality.examples: Concrete scenarios demonstrating expected interaction patterns.\n 168→\n 169→- environment: Runtime context the AI operates within. Includes system information, security boundaries, and platform-specific adaptations.\n 170→- environment.platform: OS detection, shell type, working directory, date/time awareness.\n 171→- environment.security: Rules around secrets, credentials, dangerous operations, and forbidden actions.\n 172→- environment.sandboxing: Network restrictions, file system boundaries, approval requirements for sensitive operations.\n 173→\n 174→- code_style: Standards for generated and modified code. Ensures consistency with project conventions and quality expectations.\n 175→- code_style.conventions: Formatting, naming, patterns to match existing codebase style.\n 176→- code_style.quality: Security practices, accessibility, performance considerations.\n 177→- code_style.examples: Sample code blocks demonstrating expected output format.\n 178→\n 179→- search: How the AI discovers and navigates code. Covers tool selection, search strategies, and context management for exploration tasks.\n 180→- search.tool_selection: When to use grep vs glob vs codebase indexing vs sub-agents.\n 181→- search.context_separation: How to spawn sub-agents or background tasks for large searches.\n 182→- search.examples: Sample search workflows and query patterns.\n 183→\n 184→- workflow: Structured approaches to problem-solving. Includes task tracking, operational modes, and version control practices.\n 185→- workflow.task_management: When and how to use todo lists, progress tracking, memory tools.\n 186→- workflow.modes: Different operational states like planning, spec, architect, suggest, autopilot.\n 187→- workflow.git: Version control operations including commit conventions, branch management, PR creation, and safety constraints.\n 188→- workflow.git.commands: Which git commands to use and avoid.\n 189→- workflow.git.commits: Message format, conventional commits, co-authoring, footer conventions.\n 190→- workflow.examples: Sample workflows for features, bug fixes, refactoring.\n 191→\n 192→- project_context: Instructions for loading user or project-specific configuration. Points to external files that customize AI behavior per workspace.\n 193→- project_context.config_files: Paths like CLAUDE.md, AGENTS.md, .gemini/settings, .kiro/steering.\n 194→\n 195→- tools: Everything about tools, their definitions and instructions around when, and how to use them\n 196→- tools.policies: Meta-instructions governing tool usage across all tools. Establishes priorities, parallelization rules, and fallback behaviors.\n 197→- tools.policies.guidelines: General rules for tool selection, preferring specialized tools over bash.\n 198→- tools.policies.model_steering: Emphatic overrides for common model mistakes in tool usage.\n 199→- tools.policies.examples: Correct and incorrect tool usage patterns.\n 200→- tools.description: What the tool does and its primary purpose.\n 201→- tools.conditions: When and where to use versus alternatives.\n 202→- tools.usage: How to invoke, required parameters, common patterns.\n 203→- tools.schema: Formal parameter definitions, types, constraints.\n 204→- tools.file: File system operations for reading, writing, editing, and organizing files. Core capability present in all coding assistants.\n 205→- tools.file.read: Viewing file contents, supporting various formats (text, images, notebooks, PDFs).\n 206→- tools.file.write: Creating new files, overwriting existing content.\n 207→- tools.file.edit: Targeted modifications using search/replace, diffs, or line-based edits.\n 208→- tools.file.search: Pattern matching with glob, content search with grep/ripgrep.\n 209→- tools.file.directory: Listing, creating, navigating directory structures.\n 210→- tools.shell: Terminal and command execution capabilities. Running system commands, background processes, and handling output.\n 211→- tools.shell.execution: Running commands, timeout handling, output capture.\n 212→- tools.shell.background: Long-running processes, async execution, task monitoring.\n 213→- tools.shell.restrictions: Forbidden commands, interactive mode limitations.\n 214→- tools.communication: Mechanisms for AI-user interaction beyond chat. Includes questions, confirmations, and structured feedback.\n 215→- tools.communication.questions: Asking for clarification, presenting choices, gathering preferences.\n 216→- tools.communication.notifications: Progress updates, completion messages, error reporting.\n 217→- tools.advanced: Specialized capabilities beyond basic file and shell operations. Present in some but not all assistants.\n 218→- tools.advanced.web: Fetching URLs, web search, processing external content.\n 219→- tools.advanced.agents: Spawning sub-agents, parallel task execution, background agents.\n 220→- tools.advanced.notebooks: Jupyter notebook cell editing and execution.\n 221→- tools.advanced.images: Viewing and analyzing screenshots, diagrams, visual content.\n 222→- tools.advanced.integrations: MCP servers, external tool protocols, IDE hooks.\n 223→`;\n 224→}\n 225→\n 226→/**\n 227→ * Get the default (user-editable) segmentation prompt\n 228→ * This is the part shown in the UI without the text content\n 229→ */\n 230→export function getDefaultSegmentationPrompt(): string {\n 231→ return `Given the following text, tell me where all you would apply a break.\n 232→The purpose is semantic chunking in way that's suitable for categorization. Use markdown headings.\n 233→\n 234→Return ONLY a valid JSON array of regexes with positive lookahead which I can use to run string split on in javascript.\n 235→\n 236→Example response format: [\"(?=regex-of-section-1)\", \"(?=regex-of-section2)\"]`;\n 237→}\n 238→\n 239→/**\n 240→ * Get the default (user-editable) conversation summary prompt\n 241→ * This is the part shown in the UI without the conversation content\n 242→ */\n 243→export function getDefaultSummaryPrompt(): string {\n 244→ return `Analyze this conversation and provide a concise summary covering:\n 245→\n 246→1. Goal: What is the main objective or task being discussed?\n 247→2. Turns: How many meaningful exchanges occurred? What was the flow?\n 248→3. Result: What was accomplished or concluded?\n 249→\n 250→Keep it brief and to the point. Use simple markdown text formatting only (headings, paragraphs, lists, bold).\n 251→Do not use code blocks, tables, or complex formatting.`;\n 252→}\n 253→\n 254→/**\n 255→ * Get the default (user-editable) context analysis prompt\n 256→ * This is the part shown in the UI without the data sections\n 257→ */\n 258→export function getDefaultAnalysisPrompt(): string {\n 259→ return `You are analyzing a conversation to identify opportunities for improving context relevance and efficiency.\n 260→\n 261→Analyze the data below and provide insights in markdown format covering:\n 262→\n 263→1. **Context Growth Patterns**: What patterns do you see in how context accumulated? Which components dominated?\n 264→\n 265→2. **Redundancy & Efficiency**: Are there signs of redundant context? Which components could potentially be reduced or optimized?\n 266→\n 267→3. **Context Relevance**: Based on the conversation goal, which components seem most/least relevant? Are there disproportionate allocations?\n 268→\n 269→4. **Recommendations**: Specific, actionable suggestions for improving context management in similar conversations. Focus on:\n 270→ - Components to reduce or eliminate\n 271→ - Better segmentation strategies\n 272→ - Context retrieval improvements\n 273→ - Memory optimization opportunities\n 274→\n 275→Keep your analysis practical and focused on improving context relevance. Use clear headings, bullet points, and be specific about which components you're referring to.`;\n 276→}\n 277→\n 278→/**\n 279→ * Get the default (user-editable) component coloring prompt\n 280→ * This is the part shown in the UI without the components list\n 281→ */\n 282→export function getDefaultColoringPrompt(): string {\n 283→ return `Given this list of components, assign a color to each component.\n 284→Similar kinds of components should get the same color to make it easy to visually group them.\n 285→\n 286→Available colors: orange, emerald, purple, blue, slate, indigo, gray, cyan, teal, rose, amber, violet, lime, sky\n 287→\n 288→Return ONLY a valid JSON object mapping each component to a color name.\n 289→Example format: {\"component_name\": \"orange\", \"another_component\": \"blue\"}`;\n 290→}\n 291→"
}
]
},
{
"id": "30",
"role": "assistant",
"timestamp": "2026-03-09T18:25:44.270Z",
"parts": [
{
"id": "25",
"type": "reasoning",
"token_count": 24,
"component": "understanding_codebase",
"text": "Now let me read the rest of App.tsx to understand the workflow execution and the UI parts related to component handling."
},
{
"id": "26",
"type": "text",
"token_count": 14,
"component": "understanding_codebase",
"text": "Let me read more of App.tsx and the key UI components."
},
{
"id": "27",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01VWVxsarW9Dct9tJ99Tia41",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 150,
"offset": 240
}
},
{
"id": "28",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01LLxEANrhqWyBhJ1wp2rX9y",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 200,
"offset": 390
}
},
{
"id": "29",
"type": "tool-call",
"token_count": 26,
"component": "understanding_codebase",
"toolCallId": "toolu_01WKVhhqrsDSEriRYXj91B6S",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/PromptEditorDialog.tsx"
}
}
]
},
{
"id": "31",
"role": "tool",
"timestamp": "2026-03-09T18:25:46.119Z",
"parts": [
{
"id": "32",
"type": "tool-result",
"token_count": 1677,
"component": "understanding_codebase",
"toolCallId": "toolu_01VWVxsarW9Dct9tJ99Tia41",
"toolName": "Read",
"output": " 240→ const result = await segmentConversation(\n 241→ ctx.conversation!,\n 242→ undefined,\n 243→ ctx.customSegmentationPrompt,\n 244→ ctx.id, // Pass conversationId for logging\n 245→ ctx.segmentationThreshold,\n 246→ );\n 247→ const conversation = await addTokenCounts(result.conversation);\n 248→ return {\n 249→ conversation,\n 250→ error: result.error,\n 251→ };\n 252→};\n 253→\n 254→/**\n 255→ * Component identification activity: Identify components in conversation\n 256→ */\n 257→const findComponentsActivity: Activity<{\n 258→ components: string[];\n 259→ mapping: Record<string, string>;\n 260→ timeline: ComponentTimelineSnapshot[];\n 261→ error?: string;\n 262→}> = async (ctx) => {\n 263→ const result = await componentiseConversation(\n 264→ ctx.conversation!,\n 265→ undefined,\n 266→ ctx.customPrompt,\n 267→ ctx.customComponents,\n 268→ ctx.id, // Pass conversationId for logging\n 269→ );\n 270→\n 271→ return {\n 272→ components: result.components,\n 273→ mapping: result.mapping,\n 274→ timeline: result.timeline,\n 275→ error: result.error,\n 276→ };\n 277→};\n 278→\n 279→/**\n 280→ * Color assignment activity: Assign colors to components\n 281→ */\n 282→const assignColorsActivity: Activity<{\n 283→ colors: Record<string, string>;\n 284→}> = async (ctx) => {\n 285→ if (!ctx.config || !ctx.components?.length) {\n 286→ return { colors: {} };\n 287→ }\n 288→\n 289→ const colors = await assignComponentColors(\n 290→ ctx.components,\n 291→ ctx.config,\n 292→ ctx.id,\n 293→ ctx.presetColors,\n 294→ ctx.customColoringPrompt,\n 295→ );\n 296→ return { colors };\n 297→};\n 298→\n 299→/**\n 300→ * Calculate conversation stats for the summary prompt\n 301→ */\n 302→function calculateConversationStats(conversation: {\n 303→ messages: Array<{ role: string; timestamp?: string }>;\n 304→}): ConversationStats {\n 305→ const messages = conversation.messages;\n 306→ const messageCount = messages.length;\n 307→ const turnCount = messages.filter((m) => m.role === \"user\").length;\n 308→\n 309→ let durationMs: number | undefined;\n 310→ let firstTimestamp: Date | undefined;\n 311→ let lastTimestamp: Date | undefined;\n 312→\n 313→ for (const message of messages) {\n 314→ if (message.timestamp) {\n 315→ const ts = new Date(message.timestamp);\n 316→ if (!isNaN(ts.getTime())) {\n 317→ if (!firstTimestamp || ts < firstTimestamp) firstTimestamp = ts;\n 318→ if (!lastTimestamp || ts > lastTimestamp) lastTimestamp = ts;\n 319→ }\n 320→ }\n 321→ }\n 322→\n 323→ if (firstTimestamp && lastTimestamp) {\n 324→ durationMs = lastTimestamp.getTime() - firstTimestamp.getTime();\n 325→ }\n 326→\n 327→ return { messageCount, turnCount, durationMs };\n 328→}\n 329→\n 330→/**\n 331→ * Extract component mapping from parts that have embedded component field.\n 332→ * Used when importing Context Viewer exports where component is stored on each part.\n 333→ */\n 334→function extractComponentMappingFromParts(\n 335→ conversation: Conversation,\n 336→): Record<string, string> {\n 337→ const mapping: Record<string, string> = {};\n 338→ for (const message of conversation.messages) {\n 339→ for (const part of message.parts) {\n 340→ // Parts from Context Viewer export have component embedded\n 341→ if (\"component\" in part && part.component) {\n 342→ mapping[part.id] = part.component as string;\n 343→ }\n 344→ }\n 345→ }\n 346→ return mapping;\n 347→}\n 348→\n 349→/**\n 350→ * Factory: Create summary generation activity with streaming callback\n 351→ */\n 352→const createSummaryActivity = (\n 353→ onChunk?: (id: string, chunk: string) => void,\n 354→): Activity<{ summary: string; error?: string }> => {\n 355→ return async (ctx) => {\n 356→ const stats = calculateConversationStats(ctx.conversation!);\n 357→ const result = await generateConversationSummary(\n 358→ ctx.conversation!,\n 359→ (chunk) => onChunk?.(ctx.id, chunk),\n 360→ ctx.customSummaryPrompt,\n 361→ ctx.metadata,\n 362→ stats,\n 363→ ctx.id, // Pass conversationId for logging\n 364→ );\n 365→\n 366→ return {\n 367→ summary: result.summary,\n 368→ error: result.error,\n 369→ };\n 370→ };\n 371→};\n 372→\n 373→/**\n 374→ * Factory: Create analysis generation activity with streaming callback\n 375→ */\n 376→const createAnalysisActivity = (\n 377→ onChunk?: (id: string, chunk: string) => void,\n 378→): Activity<{ analysis: string; error?: string }> => {\n 379→ return async (ctx) => {\n 380→ if (\n 381→ !ctx.aiSummary ||\n 382→ !ctx.components?.length ||\n 383→ !ctx.componentTimeline?.length\n 384→ ) {\n 385→ return { analysis: \"\" };\n 386→ }\n 387→\n 388→ const result = await generateContextAnalysis(\n 389→ ctx.conversation!,"
}
]
},
{
"id": "33",
"role": "tool",
"timestamp": "2026-03-09T18:25:47.050Z",
"parts": [
{
"id": "34",
"type": "tool-result",
"token_count": 2396,
"component": "understanding_codebase",
"toolCallId": "toolu_01LLxEANrhqWyBhJ1wp2rX9y",
"toolName": "Read",
"output": " 390→ ctx.componentTimeline!,\n 391→ ctx.components,\n 392→ ctx.aiSummary,\n 393→ (chunk) => onChunk?.(ctx.id, chunk),\n 394→ ctx.customAnalysisPrompt,\n 395→ ctx.id, // Pass conversationId for logging\n 396→ );\n 397→\n 398→ return {\n 399→ analysis: result.analysis,\n 400→ error: result.error,\n 401→ };\n 402→ };\n 403→};\n 404→\n 405→// ============================================================================\n 406→// Workflow Runner\n 407→// ============================================================================\n 408→\n 409→/**\n 410→ * WorkflowRunner: Manages state updates and timing for workflow execution\n 411→ */\n 412→class WorkflowRunner {\n 413→ constructor(\n 414→ private setState: (id: string, update: Partial<WorkflowState>) => void,\n 415→ ) {}\n 416→\n 417→ /**\n 418→ * Run an activity with timing tracking and logging\n 419→ */\n 420→ async runActivity<T>(\n 421→ ctx: Readonly<WorkflowState>,\n 422→ activity: Activity<T>,\n 423→ step?: ProcessingStep,\n 424→ ): Promise<{ result: T; timing: number }> {\n 425→ const start = Date.now();\n 426→ const result = await activity(ctx);\n 427→ const timing = Math.round((Date.now() - start) / 1000);\n 428→\n 429→ // Mark step end in the logging system if step is provided\n 430→ if (step) {\n 431→ markStepEnd(ctx.id, step as ProcessingPhase);\n 432→ }\n 433→\n 434→ return { result, timing };\n 435→ }\n 436→\n 437→ /**\n 438→ * Update state to mark a step as starting\n 439→ */\n 440→ startStep(ctx: WorkflowState, step: ProcessingStep) {\n 441→ // Mark step start in the logging system\n 442→ markStepStart(ctx.id, step as ProcessingPhase);\n 443→\n 444→ this.setState(ctx.id, {\n 445→ status: \"processing\",\n 446→ step,\n 447→ conversation: ctx.conversation,\n 448→ summary: ctx.summary,\n 449→ metadata: ctx.metadata,\n 450→ customPrompt: ctx.customPrompt,\n 451→ customSegmentationPrompt: ctx.customSegmentationPrompt,\n 452→ customSummaryPrompt: ctx.customSummaryPrompt,\n 453→ customAnalysisPrompt: ctx.customAnalysisPrompt,\n 454→ customColoringPrompt: ctx.customColoringPrompt,\n 455→ componentMapping: ctx.componentMapping,\n 456→ componentTimeline: ctx.componentTimeline,\n 457→ componentColors: ctx.componentColors,\n 458→ components: ctx.components,\n 459→ staticComponents: ctx.staticComponents,\n 460→ staticMapping: ctx.staticMapping,\n 461→ staticTimeline: ctx.staticTimeline,\n 462→ analysis: ctx.analysis,\n 463→ aiSummary: ctx.aiSummary,\n 464→ warnings:\n 465→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 466→ stepTimings: ctx.stepTimings,\n 467→ });\n 468→ }\n 469→\n 470→ /**\n 471→ * Update state with current context (intermediate update, keeps status as 'success')\n 472→ */\n 473→ updateState(ctx: WorkflowState, nextStep?: ProcessingStep) {\n 474→ this.setState(ctx.id, {\n 475→ conversation: ctx.conversation,\n 476→ summary: ctx.summary,\n 477→ metadata: ctx.metadata,\n 478→ aiSummary: ctx.aiSummary,\n 479→ customPrompt: ctx.customPrompt,\n 480→ customSegmentationPrompt: ctx.customSegmentationPrompt,\n 481→ customSummaryPrompt: ctx.customSummaryPrompt,\n 482→ customAnalysisPrompt: ctx.customAnalysisPrompt,\n 483→ customColoringPrompt: ctx.customColoringPrompt,\n 484→ components: ctx.components,\n 485→ componentMapping: ctx.componentMapping,\n 486→ componentTimeline: ctx.componentTimeline,\n 487→ componentColors: ctx.componentColors,\n 488→ staticComponents: ctx.staticComponents,\n 489→ staticMapping: ctx.staticMapping,\n 490→ staticTimeline: ctx.staticTimeline,\n 491→ analysis: ctx.analysis,\n 492→ warnings:\n 493→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 494→ stepTimings: ctx.stepTimings,\n 495→ status: \"success\",\n 496→ step: nextStep,\n 497→ });\n 498→ }\n 499→\n 500→ /**\n 501→ * Mark workflow as complete\n 502→ */\n 503→ markComplete(ctx: WorkflowState) {\n 504→ this.setState(ctx.id, {\n 505→ conversation: ctx.conversation,\n 506→ summary: ctx.summary,\n 507→ metadata: ctx.metadata,\n 508→ title: ctx.title,\n 509→ aiSummary: ctx.aiSummary,\n 510→ customPrompt: ctx.customPrompt,\n 511→ customSegmentationPrompt: ctx.customSegmentationPrompt,\n 512→ customSummaryPrompt: ctx.customSummaryPrompt,\n 513→ customAnalysisPrompt: ctx.customAnalysisPrompt,\n 514→ customColoringPrompt: ctx.customColoringPrompt,\n 515→ components: ctx.components,\n 516→ componentMapping: ctx.componentMapping,\n 517→ componentTimeline: ctx.componentTimeline,\n 518→ componentColors: ctx.componentColors,\n 519→ staticComponents: ctx.staticComponents,\n 520→ staticMapping: ctx.staticMapping,\n 521→ staticTimeline: ctx.staticTimeline,\n 522→ analysis: ctx.analysis,\n 523→ warnings:\n 524→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 525→ stepTimings: ctx.stepTimings,\n 526→ status: \"success\",\n 527→ step: undefined,\n 528→ });\n 529→ }\n 530→\n 531→ /**\n 532→ * Mark workflow as failed\n 533→ */\n 534→ markFailed(id: string, error: string) {\n 535→ this.setState(id, { status: \"failed\", step: undefined, error });\n 536→ }\n 537→\n 538→ /**\n 539→ * Mark workflow as paused waiting for API key\n 540→ */\n 541→ markPausedForApiKey(ctx: WorkflowState, nextStep: ProcessingStep) {\n 542→ this.setState(ctx.id, {\n 543→ conversation: ctx.conversation,\n 544→ summary: ctx.summary,\n 545→ metadata: ctx.metadata,\n 546→ staticComponents: ctx.staticComponents,\n 547→ staticMapping: ctx.staticMapping,\n 548→ staticTimeline: ctx.staticTimeline,\n 549→ warnings: ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 550→ stepTimings: ctx.stepTimings,\n 551→ status: \"paused-for-api-key\",\n 552→ step: undefined,\n 553→ pausedAtStep: nextStep,\n 554→ });\n 555→ }\n 556→}\n 557→\n 558→// ============================================================================\n 559→// Main Workflow\n 560→// ============================================================================\n 561→\n 562→/**\n 563→ * Process conversation workflow: Single linear workflow with conditional step skipping\n 564→ */\n 565→async function processConversationWorkflow(\n 566→ event: WorkflowEvent,\n 567→ ctx: WorkflowState,\n 568→ runner: WorkflowRunner,\n 569→ callbacks: WorkflowCallbacks,\n 570→): Promise<void> {\n 571→ try {\n 572→ if (event === WorkflowEvent.SummaryPromptChanged) {\n 573→ ctx.aiSummary = \"\";\n 574→ runner.startStep(ctx, \"summary\");\n 575→ const { result: summaryResult, timing: summaryTiming } =\n 576→ await runner.runActivity(\n 577→ ctx,\n 578→ createSummaryActivity(callbacks.onSummaryChunk),\n 579→ \"summary\",\n 580→ );\n 581→ ctx.aiSummary = summaryResult.summary;\n 582→ if (summaryResult.error) ctx.warnings!.push(summaryResult.error);\n 583→ ctx.stepTimings!.summary = summaryTiming;\n 584→\n 585→ if (ctx.regenerateAnalysis) {\n 586→ ctx.analysis = \"\";\n 587→ runner.startStep(ctx, \"analysis\");\n 588→ const { result: analysisResult, timing: analysisTiming } =\n 589→ await runner.runActivity("
}
]
},
{
"id": "35",
"role": "tool",
"timestamp": "2026-03-09T18:25:47.524Z",
"parts": [
{
"id": "36",
"type": "tool-result",
"token_count": 1212,
"component": "understanding_codebase",
"toolCallId": "toolu_01WKVhhqrsDSEriRYXj91B6S",
"toolName": "Read",
"output": " 1→import {\n 2→ Dialog,\n 3→ DialogContent,\n 4→ DialogHeader,\n 5→ DialogTitle,\n 6→} from \"@/components/ui/dialog\";\n 7→import { Button } from \"@/components/ui/button\";\n 8→import { Textarea } from \"@/components/ui/textarea\";\n 9→import { Input } from \"@/components/ui/input\";\n 10→import { AlertCircle } from \"lucide-react\";\n 11→\n 12→interface PromptEditorDialogProps {\n 13→ open: boolean;\n 14→ onOpenChange: (open: boolean) => void;\n 15→ title: string;\n 16→ description: string;\n 17→ value: string;\n 18→ onChange: (value: string) => void;\n 19→ onApply: () => void;\n 20→ placeholder?: string;\n 21→ warningText: string;\n 22→ applyButtonText?: string;\n 23→ /** Optional segmentation threshold control */\n 24→ threshold?: number;\n 25→ onThresholdChange?: (value: number) => void;\n 26→ thresholdDefault?: number;\n 27→}\n 28→\n 29→export function PromptEditorDialog({\n 30→ open,\n 31→ onOpenChange,\n 32→ title,\n 33→ description,\n 34→ value,\n 35→ onChange,\n 36→ onApply,\n 37→ placeholder = \"Enter your prompt...\",\n 38→ warningText,\n 39→ applyButtonText = \"Apply & Reprocess\",\n 40→ threshold,\n 41→ onThresholdChange,\n 42→ thresholdDefault,\n 43→}: PromptEditorDialogProps) {\n 44→ return (\n 45→ <Dialog open={open} onOpenChange={onOpenChange}>\n 46→ <DialogContent className=\"max-w-3xl max-h-[80vh] flex flex-col\">\n 47→ <DialogHeader>\n 48→ <DialogTitle>{title}</DialogTitle>\n 49→ </DialogHeader>\n 50→ <div className=\"flex-1 overflow-y-auto space-y-4 pr-2\">\n 51→ <p className=\"text-sm text-muted-foreground\">{description}</p>\n 52→ <Textarea\n 53→ value={value}\n 54→ onChange={(e) => onChange(e.target.value)}\n 55→ placeholder={placeholder}\n 56→ className=\"min-h-[300px] font-mono text-sm resize-none border-2 focus-visible:ring-0\"\n 57→ />\n 58→ {onThresholdChange && threshold != null && (\n 59→ <div className=\"flex items-center gap-3\">\n 60→ <label className=\"text-sm font-medium whitespace-nowrap\">\n 61→ Min token threshold\n 62→ </label>\n 63→ <Input\n 64→ type=\"number\"\n 65→ min={0}\n 66→ value={threshold}\n 67→ onChange={(e) => onThresholdChange(Number(e.target.value))}\n 68→ className=\"w-28 h-8 text-sm\"\n 69→ />\n 70→ <span className=\"text-xs text-muted-foreground\">\n 71→ Only message parts with more than this many tokens will be segmented\n 72→ {thresholdDefault != null && (\n 73→ <> (default: {thresholdDefault})</>\n 74→ )}\n 75→ </span>\n 76→ </div>\n 77→ )}\n 78→ <div className=\"flex items-center gap-2 text-xs text-muted-foreground bg-amber-50 border border-amber-200 rounded-md p-3\">\n 79→ <AlertCircle className=\"h-4 w-4 text-amber-600 shrink-0\" />\n 80→ <span>{warningText}</span>\n 81→ </div>\n 82→ </div>\n 83→ <div className=\"flex justify-end gap-2 pt-4 border-t\">\n 84→ <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n 85→ Cancel\n 86→ </Button>\n 87→ <Button onClick={onApply} disabled={!value.trim()}>\n 88→ {applyButtonText}\n 89→ </Button>\n 90→ </div>\n 91→ </DialogContent>\n 92→ </Dialog>\n 93→ );\n 94→}\n 95→"
}
]
},
{
"id": "42",
"role": "assistant",
"timestamp": "2026-03-09T18:25:50.777Z",
"parts": [
{
"id": "37",
"type": "reasoning",
"token_count": 33,
"component": "understanding_codebase",
"text": "This is a large feature. Let me now look at the workflow execution in App.tsx for the component prompt changed event, and the UI components that display components."
},
{
"id": "38",
"type": "text",
"token_count": 10,
"component": "understanding_codebase",
"text": "Let me continue reading the workflow and UI code."
},
{
"id": "39",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01KBEiKQiFtKkDuEBhySJzd3",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 200,
"offset": 590
}
},
{
"id": "40",
"type": "tool-call",
"token_count": 29,
"component": "understanding_codebase",
"toolCallId": "toolu_013dcMQ4mKLzqZWrhXzapZ9q",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ComponentsView.tsx",
"limit": 100
}
},
{
"id": "41",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01MTTTkPEyZVkob3ECZTY4Q1",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ComponentComparisonView.tsx",
"limit": 100
}
}
]
},
{
"id": "43",
"role": "tool",
"timestamp": "2026-03-09T18:25:52.694Z",
"parts": [
{
"id": "44",
"type": "tool-result",
"token_count": 2644,
"component": "understanding_codebase",
"toolCallId": "toolu_01KBEiKQiFtKkDuEBhySJzd3",
"toolName": "Read",
"output": " 590→ ctx,\n 591→ createAnalysisActivity(callbacks.onAnalysisChunk),\n 592→ \"analysis\",\n 593→ );\n 594→ ctx.analysis = analysisResult.analysis;\n 595→ if (analysisResult.error) ctx.warnings!.push(analysisResult.error);\n 596→ ctx.stepTimings!.analysis = analysisTiming;\n 597→ }\n 598→\n 599→ runner.markComplete(ctx);\n 600→ return;\n 601→ }\n 602→\n 603→ // Resume from API key pause - continue from segmenting step\n 604→ if (event === WorkflowEvent.ResumeFromApiKeyPause) {\n 605→ // Step 3: Segment\n 606→ runner.startStep(ctx, \"segmenting\");\n 607→ const { result: segmentResult, timing: segmentTiming } =\n 608→ await runner.runActivity(ctx, segmentActivity, \"segmenting\");\n 609→\n 610→ ctx.conversation = segmentResult.conversation;\n 611→ if (segmentResult.error) ctx.warnings!.push(segmentResult.error);\n 612→ ctx.stepTimings!.segmenting = segmentTiming;\n 613→\n 614→ runner.updateState(ctx, \"finding-components\");\n 615→\n 616→ // Step 4: Find components\n 617→ runner.startStep(ctx, \"finding-components\");\n 618→ const { result: componentResult, timing: componentTiming } =\n 619→ await runner.runActivity(\n 620→ ctx,\n 621→ findComponentsActivity,\n 622→ \"finding-components\",\n 623→ );\n 624→ ctx.components = componentResult.components;\n 625→ ctx.componentMapping = componentResult.mapping;\n 626→ ctx.componentTimeline = componentResult.timeline;\n 627→ if (componentResult.error) ctx.warnings!.push(componentResult.error);\n 628→ ctx.stepTimings![\"finding-components\"] = componentTiming;\n 629→ runner.updateState(ctx, \"coloring\");\n 630→\n 631→ // Step 5: Assign colors\n 632→ runner.startStep(ctx, \"coloring\");\n 633→ const { result: colorResult, timing: colorTiming } =\n 634→ await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n 635→ ctx.componentColors = colorResult.colors;\n 636→ ctx.stepTimings!.coloring = colorTiming;\n 637→\n 638→ runner.markComplete(ctx);\n 639→ return;\n 640→ }\n 641→\n 642→ // Step 1: Parse (only for new files)\n 643→ if (event === WorkflowEvent.NewFile) {\n 644→ runner.startStep(ctx, \"parsing\");\n 645→ const { result, timing } = await runner.runActivity(\n 646→ ctx,\n 647→ parseActivity,\n 648→ \"parsing\",\n 649→ );\n 650→ ctx.conversation = result.conversation;\n 651→ ctx.summary = result.summary;\n 652→ ctx.metadata = result.metadata;\n 653→ ctx.stepTimings!.parsing = timing;\n 654→\n 655→ // Check if this is a pre-processed Context Viewer import\n 656→ const isPreProcessed = result.metadata.parserName === \"Context Viewer\";\n 657→ if (isPreProcessed) {\n 658→ // Extract componentMapping from parts (component field on each part)\n 659→ const componentMapping = extractComponentMappingFromParts(\n 660→ ctx.conversation,\n 661→ );\n 662→ const components = [...new Set(Object.values(componentMapping))];\n 663→\n 664→ // Use pre-computed data from metadata\n 665→ ctx.title = result.metadata.title;\n 666→ ctx.componentColors = result.metadata.componentColors;\n 667→ ctx.aiSummary = result.metadata.aiSummary;\n 668→ ctx.analysis = result.metadata.analysis;\n 669→ ctx.components = components;\n 670→ ctx.componentMapping = componentMapping;\n 671→ // Restore custom prompts\n 672→ ctx.customPrompt = result.metadata.customPrompt;\n 673→ ctx.customSegmentationPrompt = result.metadata.customSegmentationPrompt;\n 674→ ctx.customSummaryPrompt = result.metadata.customSummaryPrompt;\n 675→ ctx.customAnalysisPrompt = result.metadata.customAnalysisPrompt;\n 676→ ctx.customColoringPrompt = result.metadata.customColoringPrompt;\n 677→\n 678→ // Rebuild computed fields (timelines)\n 679→ ctx.componentTimeline = buildComponentTimeline(\n 680→ ctx.conversation,\n 681→ componentMapping,\n 682→ );\n 683→ const staticResult = staticComponentise(ctx.conversation);\n 684→ ctx.staticComponents = staticResult.components;\n 685→ ctx.staticMapping = staticResult.mapping;\n 686→ ctx.staticTimeline = staticResult.timeline;\n 687→\n 688→ // Skip AI workflow, mark as success\n 689→ runner.markComplete(ctx);\n 690→ return;\n 691→ }\n 692→\n 693→ runner.updateState(ctx, \"counting-tokens\");\n 694→ }\n 695→\n 696→ // Step 2: Count tokens (only for new files - skip for grouped, they already have token counts)\n 697→ if (event === WorkflowEvent.NewFile) {\n 698→ runner.startStep(ctx, \"counting-tokens\");\n 699→ const { result, timing } = await runner.runActivity(\n 700→ ctx,\n 701→ countTokensActivity,\n 702→ \"counting-tokens\",\n 703→ );\n 704→ ctx.conversation = result.conversation;\n 705→ ctx.stepTimings![\"counting-tokens\"] = timing;\n 706→\n 707→ // Run static componentisation immediately after token counting (instant, no AI)\n 708→ const staticResult = await runner.runActivity(\n 709→ ctx,\n 710→ staticComponentsActivity,\n 711→ );\n 712→ ctx.staticComponents = staticResult.result.staticComponents;\n 713→ ctx.staticMapping = staticResult.result.staticMapping;\n 714→ ctx.staticTimeline = staticResult.result.staticTimeline;\n 715→\n 716→ // Check if API key is available before AI steps\n 717→ if (!hasApiKey()) {\n 718→ runner.markPausedForApiKey(ctx, \"segmenting\");\n 719→ return;\n 720→ }\n 721→\n 722→ runner.updateState(ctx, \"segmenting\");\n 723→ }\n 724→\n 725→ // Step 3: Segment (only for new files - skip for grouped)\n 726→ if (event === WorkflowEvent.NewFile) {\n 727→ runner.startStep(ctx, \"segmenting\");\n 728→ const { result: segmentResult, timing: segmentTiming } =\n 729→ await runner.runActivity(ctx, segmentActivity, \"segmenting\");\n 730→\n 731→ ctx.conversation = segmentResult.conversation;\n 732→ if (segmentResult.error) ctx.warnings!.push(segmentResult.error);\n 733→ ctx.stepTimings!.segmenting = segmentTiming;\n 734→\n 735→ runner.updateState(ctx, \"finding-components\");\n 736→ }\n 737→\n 738→ // For grouped conversations, skip segmenting, finding-components, and coloring\n 739→ // The merged component data is already in ctx from handleGroupConversations\n 740→ // Mark complete without running summary/analysis (user can trigger manually)\n 741→ if (event === WorkflowEvent.GroupedConversation) {\n 742→ runner.markComplete(ctx);\n 743→ return;\n 744→ }\n 745→\n 746→ // Generate summary on demand\n 747→ if (event === WorkflowEvent.GenerateSummary) {\n 748→ runner.startStep(ctx, \"summary\");\n 749→ const { result: summaryResult, timing: summaryTiming } =\n 750→ await runner.runActivity(\n 751→ ctx,\n 752→ createSummaryActivity(callbacks.onSummaryChunk),\n 753→ \"summary\",\n 754→ );\n 755→ ctx.aiSummary = summaryResult.summary;\n 756→ if (summaryResult.error) ctx.warnings!.push(summaryResult.error);\n 757→ ctx.stepTimings!.summary = summaryTiming;\n 758→ runner.markComplete(ctx);\n 759→ return;\n 760→ }\n 761→\n 762→ // For coloring prompt changed, only re-run the coloring step\n 763→ if (event === WorkflowEvent.ColoringPromptChanged) {\n 764→ runner.startStep(ctx, \"coloring\");\n 765→ const { result: colorResult, timing: colorTiming } =\n 766→ await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n 767→ ctx.componentColors = colorResult.colors;\n 768→ ctx.stepTimings!.coloring = colorTiming;\n 769→ runner.markComplete(ctx);\n 770→ return;\n 771→ }\n 772→\n 773→ // For segmentation prompt changed, start from segmenting step\n 774→ if (event === WorkflowEvent.SegmentationPromptChanged) {\n 775→ runner.startStep(ctx, \"segmenting\");\n 776→ const { result: segmentResult, timing: segmentTiming } =\n 777→ await runner.runActivity(ctx, segmentActivity, \"segmenting\");\n 778→\n 779→ ctx.conversation = segmentResult.conversation;\n 780→ if (segmentResult.error) ctx.warnings!.push(segmentResult.error);\n 781→ ctx.stepTimings!.segmenting = segmentTiming;\n 782→\n 783→ runner.updateState(ctx, \"finding-components\");\n 784→ }\n 785→\n 786→ // Step 4: Find components (skip for grouped conversations and analysis-only)\n 787→ if (\n 788→ event !== WorkflowEvent.GroupedConversation &&\n 789→ event !== WorkflowEvent.GenerateAnalysis"
}
]
},
{
"id": "45",
"role": "tool",
"timestamp": "2026-03-09T18:25:53.576Z",
"parts": [
{
"id": "46",
"type": "tool-result",
"token_count": 1378,
"component": "understanding_codebase",
"toolCallId": "toolu_013dcMQ4mKLzqZWrhXzapZ9q",
"toolName": "Read",
"output": " 1→import { useState, useMemo } from \"react\";\n 2→import { Slider } from \"@/components/ui/slider\";\n 3→import { WaffleChart } from \"./WaffleChart\";\n 4→import { CompactLegend } from \"./ComponentComparisonView\";\n 5→import { cn } from \"@/lib/utils\";\n 6→import { getComponentWaffleStyles } from \"@/lib/component-colors\";\n 7→import { getStaticComponentLabel } from \"@/lib/static-component-colors\";\n 8→import type { Conversation } from \"@/schema\";\n 9→import type { ComponentTimelineSnapshot } from \"@/componentisation\";\n 10→\n 11→// Message type filter in format \"role:type\" (e.g., \"assistant:tool-call\")\n 12→type MessageTypeFilter = string;\n 13→\n 14→interface ComponentsViewProps {\n 15→ componentMapping?: Record<string, string>;\n 16→ conversation: Conversation;\n 17→ componentTimeline?: ComponentTimelineSnapshot[];\n 18→ componentColors?: Record<string, string>;\n 19→ selectedComponent?: string | null;\n 20→ onComponentSelect?: (component: string | null) => void;\n 21→ // Static component filter - when set, only show automatic components for parts matching this static component\n 22→ staticMapping?: Record<string, string>;\n 23→ filterByStaticComponent?: string | null;\n 24→ // Filters from conversation view\n 25→ messageTypeFilters?: Set<MessageTypeFilter>;\n 26→}\n 27→\n 28→export function ComponentsView({\n 29→ componentMapping,\n 30→ conversation,\n 31→ componentTimeline,\n 32→ componentColors,\n 33→ selectedComponent,\n 34→ onComponentSelect,\n 35→ staticMapping,\n 36→ filterByStaticComponent,\n 37→ messageTypeFilters,\n 38→}: ComponentsViewProps) {\n 39→ // Initialize slider to the last message\n 40→ const [currentMessageIndex, setCurrentMessageIndex] = useState(\n 41→ conversation.messages.length - 1\n 42→ );\n 43→\n 44→ // Helper to check if a part passes the message type filter\n 45→ const partPassesMessageTypeFilter = (part: { type: string }, msgRole: string): boolean => {\n 46→ if (!messageTypeFilters || messageTypeFilters.has(\"all\")) return true;\n 47→ const filterKey = `${msgRole}:${part.type}`;\n 48→ return messageTypeFilters.has(filterKey);\n 49→ };\n 50→\n 51→ // Get the set of part IDs that match the static component filter\n 52→ const filteredPartIds = useMemo(() => {\n 53→ if (!filterByStaticComponent || !staticMapping) return null;\n 54→\n 55→ const ids = new Set<string>();\n 56→ for (const [partId, staticComp] of Object.entries(staticMapping)) {\n 57→ if (staticComp === filterByStaticComponent) {\n 58→ ids.add(partId);\n 59→ }\n 60→ }\n 61→ return ids;\n 62→ }, [filterByStaticComponent, staticMapping]);\n 63→\n 64→ // Compute messageComponents for workflow view (filtered, up to current slider position)\n 65→ // Must be before early return to follow React hooks rules\n 66→ const messageComponents = useMemo(() => {\n 67→ if (!componentMapping) return [];\n 68→ const components: string[] = [];\n 69→ conversation.messages.forEach((message, msgIndex) => {\n 70→ if (msgIndex <= currentMessageIndex) {\n 71→ // Find the primary component for this message from first matching part\n 72→ let messageComponent: string | null = null;\n 73→ for (const part of message.parts) {\n 74→ // Apply message type filter\n 75→ if (!partPassesMessageTypeFilter(part, message.role)) continue;\n 76→\n 77→ // Apply static component filter if set\n 78→ if (filteredPartIds && !filteredPartIds.has(part.id)) continue;\n 79→\n 80→ const component = componentMapping[part.id];\n 81→ if (component) {\n 82→ messageComponent = component;\n 83→ break;\n 84→ }\n 85→ }\n 86→ // Only include message if it has parts that pass filters\n 87→ if (messageComponent !== null) {\n 88→ components.push(messageComponent);\n 89→ }\n 90→ }\n 91→ });\n 92→ return components;\n 93→ }, [conversation.messages, currentMessageIndex, componentMapping, filteredPartIds, messageTypeFilters]);\n 94→\n 95→ if (!componentMapping || Object.keys(componentMapping).length === 0) {\n 96→ return (\n 97→ <div className=\"p-8 text-center text-muted-foreground\">\n 98→ <p>No component mapping available yet.</p>\n 99→ <p className=\"text-sm mt-2\">\n 100→ Component mapping will appear here after processing."
}
]
},
{
"id": "47",
"role": "tool",
"timestamp": "2026-03-09T18:25:53.923Z",
"parts": [
{
"id": "48",
"type": "tool-result",
"token_count": 1418,
"component": "understanding_codebase",
"toolCallId": "toolu_01MTTTkPEyZVkob3ECZTY4Q1",
"toolName": "Read",
"output": " 1→import { useState } from \"react\";\n 2→import { cn } from \"@/lib/utils\";\n 3→import { getComponentWaffleStyles } from \"@/lib/component-colors\";\n 4→import { ArrowUp, ArrowDown, LayoutGrid, Rows3 } from \"lucide-react\";\n 5→import { Separator } from \"@/components/ui/separator\";\n 6→\n 7→type SortField = \"tokens\" | \"name\" | \"category\";\n 8→type SortDirection = \"asc\" | \"desc\";\n 9→\n 10→export interface ConversationComponentData {\n 11→ id: string;\n 12→ filename: string;\n 13→ title?: string; // Custom title, displays instead of filename when set\n 14→ componentTokens: Record<string, number>;\n 15→ totalTokens: number;\n 16→ turnCount: number; // Number of user messages (turns)\n 17→ messageCount: number; // Total messages\n 18→ durationMs?: number; // Duration in milliseconds (from first to last message)\n 19→ messageComponents?: string[]; // Component for each message in order (for workflow view)\n 20→}\n 21→\n 22→/**\n 23→ * Format duration in a human-readable format\n 24→ */\n 25→function formatDuration(ms: number): string {\n 26→ const seconds = Math.floor(ms / 1000);\n 27→ const minutes = Math.floor(seconds / 60);\n 28→ const hours = Math.floor(minutes / 60);\n 29→\n 30→ if (hours > 0) {\n 31→ const remainingMinutes = minutes % 60;\n 32→ return `${hours}h ${remainingMinutes}m`;\n 33→ } else if (minutes > 0) {\n 34→ const remainingSeconds = seconds % 60;\n 35→ return `${minutes}m ${remainingSeconds}s`;\n 36→ } else {\n 37→ return `${seconds}s`;\n 38→ }\n 39→}\n 40→\n 41→/**\n 42→ * Extract the category (prefix before first dot) from a component name\n 43→ */\n 44→function getCategory(component: string): string {\n 45→ const dotIndex = component.indexOf(\".\");\n 46→ return dotIndex > 0 ? component.substring(0, dotIndex) : component;\n 47→}\n 48→\n 49→/**\n 50→ * Sort components by category - groups components by their prefix,\n 51→ * sorts categories by total tokens, then sorts within each category by tokens\n 52→ */\n 53→function sortByCategory(\n 54→ componentTokens: Record<string, number>,\n 55→ direction: SortDirection\n 56→): Array<{ component: string; tokens: number; percentage: number; category: string }> {\n 57→ // Calculate total tokens\n 58→ const totalTokens = Object.values(componentTokens).reduce((sum, t) => sum + t, 0);\n 59→\n 60→ // Build component data with category info\n 61→ const componentData = Object.entries(componentTokens).map(([component, tokens]) => ({\n 62→ component,\n 63→ tokens,\n 64→ percentage: totalTokens > 0 ? (tokens / totalTokens) * 100 : 0,\n 65→ category: getCategory(component),\n 66→ }));\n 67→\n 68→ // Calculate category totals\n 69→ const categoryTotals: Record<string, number> = {};\n 70→ for (const { category, tokens } of componentData) {\n 71→ categoryTotals[category] = (categoryTotals[category] || 0) + tokens;\n 72→ }\n 73→\n 74→ // Sort: first by category total, then by individual tokens within category\n 75→ const dir = direction === \"asc\" ? 1 : -1;\n 76→ return componentData.sort((a, b) => {\n 77→ const categoryCompare = ((categoryTotals[b.category] || 0) - (categoryTotals[a.category] || 0)) * dir;\n 78→ if (categoryCompare !== 0) return categoryCompare;\n 79→ // Within same category, sort by tokens in same direction\n 80→ return (b.tokens - a.tokens) * dir;\n 81→ });\n 82→}\n 83→\n 84→// Export types for URL state integration\n 85→export type ViewMode = \"tokens\" | \"workflow\" | \"tokens-absolute\";\n 86→export type LegendMode = \"expanded\" | \"compact\";\n 87→export type { SortField, SortDirection };\n 88→\n 89→interface ComponentComparisonViewProps {\n 90→ sourceConversations: ConversationComponentData[];\n 91→ componentColors?: Record<string, string>;\n 92→ hasActiveFilters?: boolean;\n 93→ groupTitle?: string;\n 94→ onConversationClick?: (id: string) => void;\n 95→ // Controlled state props (optional - falls back to local state if not provided)\n 96→ viewMode?: ViewMode;\n 97→ onViewModeChange?: (mode: ViewMode) => void;\n 98→ legendMode?: LegendMode;\n 99→ onLegendModeChange?: (mode: LegendMode) => void;\n 100→ sortField?: SortField;"
}
]
},
{
"id": "53",
"role": "assistant",
"timestamp": "2026-03-09T18:26:23.383Z",
"parts": [
{
"id": "49",
"type": "reasoning",
"token_count": 27,
"component": "feature_design",
"text": "This is a very large feature. Let me plan this properly before implementing. Let me use the Plan agent to design the implementation strategy."
},
{
"id": "50",
"type": "text",
"token_count": 16,
"component": "understanding_codebase",
"text": "Let me read more of the key files to understand the full picture before planning."
},
{
"id": "51",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01AE2SQ3tBrvQqxTVL8jnsAu",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 200,
"offset": 790
}
},
{
"id": "52",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01Th2P7r72KPCDt6dBxunniF",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 200,
"offset": 990
}
}
]
},
{
"id": "54",
"role": "tool",
"timestamp": "2026-03-09T18:26:38.475Z",
"parts": [
{
"id": "55",
"type": "tool-result",
"token_count": 2498,
"component": "understanding_codebase",
"toolCallId": "toolu_01AE2SQ3tBrvQqxTVL8jnsAu",
"toolName": "Read",
"output": " 790→ ) {\n 791→ runner.startStep(ctx, \"finding-components\");\n 792→ const { result: componentResult, timing: componentTiming } =\n 793→ await runner.runActivity(\n 794→ ctx,\n 795→ findComponentsActivity,\n 796→ \"finding-components\",\n 797→ );\n 798→ ctx.components = componentResult.components;\n 799→ ctx.componentMapping = componentResult.mapping;\n 800→ ctx.componentTimeline = componentResult.timeline;\n 801→ if (componentResult.error) ctx.warnings!.push(componentResult.error);\n 802→ ctx.stepTimings![\"finding-components\"] = componentTiming;\n 803→ runner.updateState(ctx, \"coloring\");\n 804→\n 805→ // Step 5: Assign colors (skip for grouped conversations - colors already merged)\n 806→ runner.startStep(ctx, \"coloring\");\n 807→ const { result: colorResult, timing: colorTiming } =\n 808→ await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n 809→ ctx.componentColors = colorResult.colors;\n 810→ ctx.stepTimings!.coloring = colorTiming;\n 811→\n 812→ // For new files, mark complete without analysis (user can trigger it manually)\n 813→ if (event === WorkflowEvent.NewFile) {\n 814→ runner.markComplete(ctx);\n 815→ return;\n 816→ }\n 817→\n 818→ runner.updateState(ctx, \"analysis\");\n 819→ }\n 820→\n 821→ // Step 6: Generate analysis (only for explicit analysis generation or reprocessing)\n 822→ // Run for: GenerateAnalysis, ComponentPromptChanged, SegmentationPromptChanged\n 823→ if (\n 824→ event === WorkflowEvent.GenerateAnalysis ||\n 825→ event === WorkflowEvent.ComponentPromptChanged ||\n 826→ event === WorkflowEvent.SegmentationPromptChanged\n 827→ ) {\n 828→ // Clear old analysis if reprocessing\n 829→ if (\n 830→ event === WorkflowEvent.ComponentPromptChanged ||\n 831→ event === WorkflowEvent.SegmentationPromptChanged\n 832→ ) {\n 833→ ctx.analysis = \"\";\n 834→ runner.updateState(ctx, \"analysis\");\n 835→ }\n 836→\n 837→ runner.startStep(ctx, \"analysis\");\n 838→ const { result: analysisResult, timing: analysisTiming } =\n 839→ await runner.runActivity(\n 840→ ctx,\n 841→ createAnalysisActivity(callbacks.onAnalysisChunk),\n 842→ \"analysis\",\n 843→ );\n 844→ ctx.analysis = analysisResult.analysis;\n 845→ if (analysisResult.error) ctx.warnings!.push(analysisResult.error);\n 846→ ctx.stepTimings!.analysis = analysisTiming;\n 847→ }\n 848→\n 849→ runner.markComplete(ctx);\n 850→ } catch (error: any) {\n 851→ runner.markFailed(ctx.id, error.message);\n 852→ }\n 853→}\n 854→\n 855→// ============================================================================\n 856→// Batch workflow orchestration\n 857→// ============================================================================\n 858→\n 859→interface WorkflowOptions {\n 860→ customComponents?: string[];\n 861→ presetColors?: Record<string, string>;\n 862→ customPrompt?: string;\n 863→ customSegmentationPrompt?: string;\n 864→}\n 865→\n 866→async function runWorkflows(\n 867→ files: File[],\n 868→ fileIds: Map<number, string>,\n 869→ onStepUpdate?: (id: string, step: ProcessingStep) => void,\n 870→ onFileComplete?: (conversation: WorkflowState) => void,\n 871→ onAISummaryChunk?: (id: string, chunk: string) => void,\n 872→ onAnalysisChunk?: (id: string, chunk: string) => void,\n 873→ options?: WorkflowOptions,\n 874→): Promise<WorkflowBatchResult> {\n 875→ // Give React a chance to render the placeholders before we start processing\n 876→ await new Promise((resolve) => setTimeout(resolve, 0));\n 877→\n 878→ // Process all files in parallel\n 879→ const workflowStates = await Promise.all(\n 880→ files.map(async (file, i) => {\n 881→ if (!file) return null;\n 882→\n 883→ const id = fileIds.get(i) || generateId();\n 884→\n 885→ // Create workflow runner for this file\n 886→ const runner = new WorkflowRunner((id, update) => {\n 887→ onFileComplete?.({\n 888→ id,\n 889→ filename: file.name,\n 890→ ...update,\n 891→ } as WorkflowState);\n 892→ });\n 893→\n 894→ // Initialize workflow context\n 895→ const ctx: WorkflowState = {\n 896→ id,\n 897→ filename: file.name,\n 898→ file,\n 899→ conversation: null as any, // Will be set by parse activity\n 900→ warnings: [],\n 901→ stepTimings: {},\n 902→ config: getComponentisationConfig(),\n 903→ customComponents: options?.customComponents,\n 904→ presetColors: options?.presetColors,\n 905→ customPrompt: options?.customPrompt,\n 906→ customSegmentationPrompt: options?.customSegmentationPrompt,\n 907→ };\n 908→\n 909→ // Run workflow with NewFile event\n 910→ await processConversationWorkflow(WorkflowEvent.NewFile, ctx, runner, {\n 911→ onSummaryChunk: onAISummaryChunk,\n 912→ onAnalysisChunk: onAnalysisChunk,\n 913→ });\n 914→\n 915→ // Return final parsed conversation\n 916→ return {\n 917→ id,\n 918→ filename: file.name,\n 919→ status: ctx.conversation ? \"success\" : \"failed\",\n 920→ conversation: ctx.conversation,\n 921→ summary: ctx.summary,\n 922→ metadata: ctx.metadata,\n 923→ aiSummary: ctx.aiSummary,\n 924→ components: ctx.components,\n 925→ componentMapping: ctx.componentMapping,\n 926→ componentTimeline: ctx.componentTimeline,\n 927→ componentColors: ctx.componentColors,\n 928→ staticComponents: ctx.staticComponents,\n 929→ staticMapping: ctx.staticMapping,\n 930→ staticTimeline: ctx.staticTimeline,\n 931→ analysis: ctx.analysis,\n 932→ warnings:\n 933→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 934→ stepTimings: ctx.stepTimings,\n 935→ } as WorkflowState;\n 936→ }),\n 937→ );\n 938→\n 939→ // Filter out any null values from skipped files\n 940→ return {\n 941→ workflowStates: workflowStates.filter(\n 942→ (c): c is WorkflowState => c !== null,\n 943→ ),\n 944→ };\n 945→}\n 946→\n 947→export default function App() {\n 948→ const [conversations, setConversations] = useState<WorkflowState[]>([]);\n 949→ const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n 950→\n 951→ // URL state management\n 952→ const {\n 953→ state: urlState,\n 954→ navigateToConversation,\n 955→ navigateToTab,\n 956→ setInsightsTab,\n 957→ setSidebarCollapsed,\n 958→ setInsightsCollapsed,\n 959→ setSearchQuery,\n 960→ setSort,\n 961→ setMessageFilters,\n 962→ setComponentFilters,\n 963→ setComparisonView,\n 964→ setComparisonLegend,\n 965→ setComparisonSortBy,\n 966→ setComparisonSortDir,\n 967→ setComparisonCols,\n 968→ setComparisonSquaresPerRow,\n 969→ } = useUrlState();\n 970→\n 971→ // Derive selectedId, insightsTab, and panel collapse states from URL state\n 972→ const selectedId = urlState.conversationId;\n 973→ const insightsTab = urlState.insightsTab;\n 974→ const isSidebarCollapsed = urlState.sidebarCollapsed;\n 975→ const isInsightsPanelCollapsed = urlState.insightsCollapsed;\n 976→\n 977→ // Callback to change selected conversation (with history entry)\n 978→ const setSelectedId = useCallback((id: string | null) => {\n 979→ if (id === null) {\n 980→ // Navigate to home when deselecting - don't create history entry\n 981→ const basePath = import.meta.env.BASE_URL || \"/\";\n 982→ window.history.replaceState({}, \"\", basePath);\n 983→ } else {\n 984→ // Check if the conversation is grouped\n 985→ const conv = conversations.find(c => c.id === id);\n 986→ const isGrouped = conv?.isGrouped ?? false;\n 987→ navigateToConversation(id, isGrouped);\n 988→ }\n 989→ }, [conversations, navigateToConversation]);"
}
]
},
{
"id": "56",
"role": "tool",
"timestamp": "2026-03-09T18:26:44.399Z",
"parts": [
{
"id": "57",
"type": "tool-result",
"token_count": 2788,
"component": "understanding_codebase",
"toolCallId": "toolu_01Th2P7r72KPCDt6dBxunniF",
"toolName": "Read",
"output": " 990→\n 991→ // Sidebar and insights panel collapse is managed via URL state above\n 992→\n 993→ // Prompt editor dialog state\n 994→ const [isPromptDialogOpen, setIsPromptDialogOpen] = useState(false);\n 995→ const [editingPrompt, setEditingPrompt] = useState(\n 996→ getDefaultComponentIdentificationPrompt(),\n 997→ );\n 998→\n 999→ // Components editor dialog state\n 1000→ const [isComponentsDialogOpen, setIsComponentsDialogOpen] = useState(false);\n 1001→ const [editingComponents, setEditingComponents] = useState(\"\");\n 1002→\n 1003→ // Segmentation prompt editor dialog state\n 1004→ const [isSegmentationPromptDialogOpen, setIsSegmentationPromptDialogOpen] =\n 1005→ useState(false);\n 1006→ const [editingSegmentationPrompt, setEditingSegmentationPrompt] = useState(\n 1007→ getDefaultSegmentationPrompt(),\n 1008→ );\n 1009→ const [editingSegmentationThreshold, setEditingSegmentationThreshold] =\n 1010→ useState(DEFAULT_SEGMENTATION_THRESHOLD);\n 1011→\n 1012→ // Summary prompt editor dialog state\n 1013→ const [isSummaryPromptDialogOpen, setIsSummaryPromptDialogOpen] =\n 1014→ useState(false);\n 1015→ const [editingSummaryPrompt, setEditingSummaryPrompt] = useState(\n 1016→ getDefaultSummaryPrompt(),\n 1017→ );\n 1018→\n 1019→ // Analysis prompt editor dialog state\n 1020→ const [isAnalysisPromptDialogOpen, setIsAnalysisPromptDialogOpen] =\n 1021→ useState(false);\n 1022→ const [editingAnalysisPrompt, setEditingAnalysisPrompt] = useState(\n 1023→ getDefaultAnalysisPrompt(),\n 1024→ );\n 1025→\n 1026→ // Coloring prompt editor dialog state\n 1027→ const [isColoringPromptDialogOpen, setIsColoringPromptDialogOpen] =\n 1028→ useState(false);\n 1029→ const [editingColoringPrompt, setEditingColoringPrompt] = useState(\n 1030→ getDefaultColoringPrompt(),\n 1031→ );\n 1032→\n 1033→ // Preset state\n 1034→ const [availablePresets, setAvailablePresets] = useState<PresetSummary[]>([]);\n 1035→ const [selectedPresetId, setSelectedPresetId] = useState<string | null>(null);\n 1036→ const [loadedPreset, setLoadedPreset] = useState<PresetConfig | null>(null);\n 1037→ const [isPresetLoading, setIsPresetLoading] = useState(false);\n 1038→ const [presetError, setPresetError] = useState<string | null>(null);\n 1039→\n 1040→ // URL auto-import state\n 1041→ const importInProgressRef = useRef(false);\n 1042→ const [importError, setImportError] = useState<string | null>(null);\n 1043→ const [isUrlImporting, setIsUrlImporting] = useState(false);\n 1044→\n 1045→ const fileIdsRef = useRef<Map<number, string>>(new Map());\n 1046→\n 1047→ // Pending groups from SessionExport import\n 1048→ // Maps old file IDs to file indices, plus the groups to recreate\n 1049→ const pendingSessionImportRef = useRef<{\n 1050→ oldIdToIndex: Map<string, number>;\n 1051→ groups: Array<{ id: string; name: string; title?: string; fileIds: string[] }>;\n 1052→ } | null>(null);\n 1053→\n 1054→ // API key state\n 1055→ const [hasApiKeyState, setHasApiKeyState] = useState(() => hasApiKey());\n 1056→\n 1057→ // Count paused workflows\n 1058→ const pausedWorkflowCount = useMemo(\n 1059→ () => conversations.filter((c) => c.status === \"paused-for-api-key\").length,\n 1060→ [conversations]\n 1061→ );\n 1062→\n 1063→ // Load preset index on mount\n 1064→ useEffect(() => {\n 1065→ loadPresetIndex().then(setAvailablePresets);\n 1066→ }, []);\n 1067→\n 1068→ // Load full preset when selection changes\n 1069→ useEffect(() => {\n 1070→ if (selectedPresetId) {\n 1071→ setIsPresetLoading(true);\n 1072→ setPresetError(null);\n 1073→ loadPreset(selectedPresetId)\n 1074→ .then((preset) => {\n 1075→ setLoadedPreset(preset);\n 1076→ setIsPresetLoading(false);\n 1077→ })\n 1078→ .catch((error) => {\n 1079→ console.error(\"Failed to load preset:\", error);\n 1080→ setPresetError(error.message);\n 1081→ setLoadedPreset(null);\n 1082→ setIsPresetLoading(false);\n 1083→ });\n 1084→ } else {\n 1085→ setLoadedPreset(null);\n 1086→ setPresetError(null);\n 1087→ }\n 1088→ }, [selectedPresetId]);\n 1089→\n 1090→ const workflowMutation = useMutation({\n 1091→ mutationFn: ({ files }: { files: File[], presetIds?: Map<number, string> }) => {\n 1092→ // Build options from loaded preset\n 1093→ const options: WorkflowOptions | undefined = loadedPreset\n 1094→ ? {\n 1095→ customComponents: loadedPreset.components,\n 1096→ presetColors: loadedPreset.colors,\n 1097→ customPrompt: loadedPreset.componentIdentificationPrompt,\n 1098→ customSegmentationPrompt: loadedPreset.segmentationPrompt,\n 1099→ }\n 1100→ : undefined;\n 1101→\n 1102→ return runWorkflows(\n 1103→ files,\n 1104→ fileIdsRef.current,\n 1105→ (id, step) => {\n 1106→ // Update step\n 1107→ setConversations((prev) =>\n 1108→ prev.map((conv) =>\n 1109→ conv.id === id\n 1110→ ? { ...conv, status: \"processing\" as const, step }\n 1111→ : conv,\n 1112→ ),\n 1113→ );\n 1114→ },\n 1115→ (completed) => {\n 1116→ // Update the conversation in place as each file completes\n 1117→ // Preserve aiSummary and analysis if they're being streamed in parallel\n 1118→ setConversations((prev) =>\n 1119→ prev.map((conv) =>\n 1120→ conv.id === completed.id\n 1121→ ? {\n 1122→ ...completed,\n 1123→ aiSummary: completed.aiSummary || conv.aiSummary,\n 1124→ analysis: completed.analysis || conv.analysis,\n 1125→ }\n 1126→ : conv,\n 1127→ ),\n 1128→ );\n 1129→ },\n 1130→ (id, chunk) => {\n 1131→ // Update AI summary as chunks arrive (streaming)\n 1132→ setConversations((prev) =>\n 1133→ prev.map((conv) =>\n 1134→ conv.id === id\n 1135→ ? { ...conv, aiSummary: (conv.aiSummary || \"\") + chunk }\n 1136→ : conv,\n 1137→ ),\n 1138→ );\n 1139→ },\n 1140→ (id, chunk) => {\n 1141→ // Update analysis as chunks arrive (streaming)\n 1142→ setConversations((prev) =>\n 1143→ prev.map((conv) =>\n 1144→ conv.id === id\n 1145→ ? { ...conv, analysis: (conv.analysis || \"\") + chunk }\n 1146→ : conv,\n 1147→ ),\n 1148→ );\n 1149→ },\n 1150→ options,\n 1151→ );\n 1152→ },\n 1153→ onMutate: ({ files, presetIds }: { files: File[], presetIds?: Map<number, string> }) => {\n 1154→ // Create placeholder entries immediately\n 1155→ const fileIds = new Map<number, string>();\n 1156→ const placeholders: WorkflowState[] = files.map((file, index) => {\n 1157→ const id = presetIds?.get(index) || generateId();\n 1158→ fileIds.set(index, id);\n 1159→ return {\n 1160→ id,\n 1161→ filename: file.name,\n 1162→ status: \"pending\",\n 1163→ };\n 1164→ });\n 1165→\n 1166→ fileIdsRef.current = fileIds;\n 1167→ setConversations((prev) => [...prev, ...placeholders]);\n 1168→\n 1169→ // Auto-select first file if nothing selected\n 1170→ if (!selectedId && placeholders[0]) {\n 1171→ setSelectedId(placeholders[0].id);\n 1172→ }\n 1173→ },\n 1174→ onSuccess: () => {\n 1175→ // Note: pendingSessionImportRef groups are processed by a useEffect\n 1176→ // that watches for when all required files are ready.\n 1177→ // Don't clear fileIdsRef here if we have pending groups - the useEffect needs it.\n 1178→ if (!pendingSessionImportRef.current) {\n 1179→ fileIdsRef.current = new Map();\n 1180→ }\n 1181→ },\n 1182→ onError: () => {\n 1183→ fileIdsRef.current = new Map();\n 1184→ },\n 1185→ });\n 1186→\n 1187→ const selectedConversation = useMemo(() => {\n 1188→ if (conversations.length === 0) return undefined;\n 1189→ return ("
}
]
},
{
"id": "62",
"role": "assistant",
"timestamp": "2026-03-09T18:26:49.715Z",
"parts": [
{
"id": "58",
"type": "reasoning",
"token_count": 23,
"component": "understanding_codebase",
"text": "Now let me look at the part where prompts are applied/re-run, and the sidebar UI for prompt editing buttons."
},
{
"id": "59",
"type": "text",
"token_count": 16,
"component": "understanding_codebase",
"text": "Let me find where the prompt dialogs are opened and where re-processing is triggered."
},
{
"id": "60",
"type": "tool-call",
"token_count": 47,
"component": "understanding_codebase",
"toolCallId": "toolu_017VvYX4871csStXkDSEethT",
"toolName": "Grep",
"input": {
"pattern": "handleApplyComponentPrompt|handleApplyComponent|ComponentPromptChanged",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
},
{
"id": "61",
"type": "tool-call",
"token_count": 48,
"component": "understanding_codebase",
"toolCallId": "toolu_01EZgBvJn1otwxGkRXBfKaYV",
"toolName": "Grep",
"input": {
"pattern": "isPromptDialogOpen|Edit Component|Edit Prompt|Prompt Editor",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "63",
"role": "tool",
"timestamp": "2026-03-09T18:26:53.278Z",
"parts": [
{
"id": "64",
"type": "tool-result",
"token_count": 112,
"component": "understanding_codebase",
"toolCallId": "toolu_017VvYX4871csStXkDSEethT",
"toolName": "Grep",
"output": "164: ComponentPromptChanged = \"component-prompt-changed\",\n822: // Run for: GenerateAnalysis, ComponentPromptChanged, SegmentationPromptChanged\n825: event === WorkflowEvent.ComponentPromptChanged ||\n830: event === WorkflowEvent.ComponentPromptChanged ||\n1464: const handleApplyComponents = async () => {\n1694: event = WorkflowEvent.ComponentPromptChanged;\n1856: WorkflowEvent.ComponentPromptChanged,\n3013: onApply={handleApplyComponents}"
}
]
},
{
"id": "65",
"role": "tool",
"timestamp": "2026-03-09T18:26:54.085Z",
"parts": [
{
"id": "66",
"type": "tool-result",
"token_count": 147,
"component": "understanding_codebase",
"toolCallId": "toolu_01EZgBvJn1otwxGkRXBfKaYV",
"toolName": "Grep",
"output": "994: const [isPromptDialogOpen, setIsPromptDialogOpen] = useState(false);\n1020: const [isAnalysisPromptDialogOpen, setIsAnalysisPromptDialogOpen] =\n1528: setIsAnalysisPromptDialogOpen(true);\n1533: setIsAnalysisPromptDialogOpen(false);\n2993: {/* Prompt Editor Dialogs */}\n2995: open={isPromptDialogOpen}\n2997: title=\"Edit Component Identification Prompt\"\n3009: title=\"Edit Components\"\n3046: open={isAnalysisPromptDialogOpen}\n3047: onOpenChange={setIsAnalysisPromptDialogOpen}"
}
]
},
{
"id": "68",
"role": "assistant",
"timestamp": "2026-03-09T18:26:56.887Z",
"parts": [
{
"id": "67",
"type": "tool-call",
"token_count": 31,
"component": "understanding_codebase",
"toolCallId": "toolu_01FbequbQAmJCF1USquNHKge",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 200,
"offset": 1450
}
}
]
},
{
"id": "69",
"role": "tool",
"timestamp": "2026-03-09T18:26:56.907Z",
"parts": [
{
"id": "70",
"type": "tool-result",
"token_count": 2678,
"component": "understanding_codebase",
"toolCallId": "toolu_01FbequbQAmJCF1USquNHKge",
"toolName": "Read",
"output": " 1450→ await handleReprocessComponents({ customPrompt: editingPrompt });\n 1451→ }\n 1452→ };\n 1453→\n 1454→ // Handle opening the components editor\n 1455→ const handleOpenComponentsEditor = (id: string) => {\n 1456→ setSelectedId(id);\n 1457→ const conv = conversations.find((c) => c.id === id);\n 1458→ const currentComponents = conv?.components || [];\n 1459→ setEditingComponents(currentComponents.join(\"\\n\"));\n 1460→ setIsComponentsDialogOpen(true);\n 1461→ };\n 1462→\n 1463→ // Handle applying the edited components\n 1464→ const handleApplyComponents = async () => {\n 1465→ setIsComponentsDialogOpen(false);\n 1466→ if (selectedConversation && selectedConversation.conversation) {\n 1467→ // Parse components from the text (one per line, trimmed, non-empty)\n 1468→ const components = editingComponents\n 1469→ .split(\"\\n\")\n 1470→ .map((line) => line.trim())\n 1471→ .filter((line) => line.length > 0);\n 1472→ if (components.length > 0) {\n 1473→ await handleReprocessComponents({ customComponents: components });\n 1474→ }\n 1475→ }\n 1476→ };\n 1477→\n 1478→ // Handle opening the segmentation prompt editor\n 1479→ const handleOpenSegmentationPromptEditor = (id: string) => {\n 1480→ setSelectedId(id);\n 1481→ const conv = conversations.find((c) => c.id === id);\n 1482→ const currentPrompt =\n 1483→ conv?.customSegmentationPrompt ||\n 1484→ getDefaultSegmentationPrompt();\n 1485→ setEditingSegmentationPrompt(currentPrompt);\n 1486→ setEditingSegmentationThreshold(conv?.segmentationThreshold ?? DEFAULT_SEGMENTATION_THRESHOLD);\n 1487→ setIsSegmentationPromptDialogOpen(true);\n 1488→ };\n 1489→\n 1490→ // Handle applying the edited segmentation prompt\n 1491→ const handleApplySegmentationPrompt = async () => {\n 1492→ setIsSegmentationPromptDialogOpen(false);\n 1493→ if (selectedConversation && selectedConversation.conversation) {\n 1494→ await handleReprocessSegmentation({\n 1495→ customSegmentationPrompt: editingSegmentationPrompt,\n 1496→ segmentationThreshold: editingSegmentationThreshold,\n 1497→ });\n 1498→ }\n 1499→ };\n 1500→\n 1501→ // Handle opening the summary prompt editor\n 1502→ const handleOpenSummaryPromptEditor = (id: string) => {\n 1503→ setSelectedId(id);\n 1504→ const conv = conversations.find((c) => c.id === id);\n 1505→ const currentPrompt =\n 1506→ conv?.customSummaryPrompt || getDefaultSummaryPrompt();\n 1507→ setEditingSummaryPrompt(currentPrompt);\n 1508→ setIsSummaryPromptDialogOpen(true);\n 1509→ };\n 1510→\n 1511→ // Handle applying the edited summary prompt\n 1512→ const handleApplySummaryPrompt = async () => {\n 1513→ setIsSummaryPromptDialogOpen(false);\n 1514→ if (selectedConversation && selectedConversation.conversation) {\n 1515→ await handleReprocessSummary({\n 1516→ customSummaryPrompt: editingSummaryPrompt,\n 1517→ });\n 1518→ }\n 1519→ };\n 1520→\n 1521→ // Handle opening the analysis prompt editor\n 1522→ const handleOpenAnalysisPromptEditor = (id: string) => {\n 1523→ setSelectedId(id);\n 1524→ const conv = conversations.find((c) => c.id === id);\n 1525→ const currentPrompt =\n 1526→ conv?.customAnalysisPrompt || getDefaultAnalysisPrompt();\n 1527→ setEditingAnalysisPrompt(currentPrompt);\n 1528→ setIsAnalysisPromptDialogOpen(true);\n 1529→ };\n 1530→\n 1531→ // Handle applying the edited analysis prompt\n 1532→ const handleApplyAnalysisPrompt = async () => {\n 1533→ setIsAnalysisPromptDialogOpen(false);\n 1534→ if (selectedConversation && selectedConversation.conversation) {\n 1535→ await handleGenerateAnalysis(selectedConversation.id, {\n 1536→ customAnalysisPrompt: editingAnalysisPrompt,\n 1537→ });\n 1538→ }\n 1539→ };\n 1540→\n 1541→ // Handle opening the coloring prompt editor\n 1542→ const handleOpenColoringPromptEditor = (id: string) => {\n 1543→ setSelectedId(id);\n 1544→ const conv = conversations.find((c) => c.id === id);\n 1545→ const currentPrompt =\n 1546→ conv?.customColoringPrompt || getDefaultColoringPrompt();\n 1547→ setEditingColoringPrompt(currentPrompt);\n 1548→ setIsColoringPromptDialogOpen(true);\n 1549→ };\n 1550→\n 1551→ // Handle applying the edited coloring prompt\n 1552→ const handleApplyColoringPrompt = async () => {\n 1553→ setIsColoringPromptDialogOpen(false);\n 1554→ if (!selectedConversation?.conversation) return;\n 1555→\n 1556→ const id = selectedConversation.id;\n 1557→ setReprocessingId(id);\n 1558→\n 1559→ try {\n 1560→ const runner = new WorkflowRunner((id, update) => {\n 1561→ setConversations((prev) =>\n 1562→ prev.map((conv) => (conv.id === id ? { ...conv, ...update } : conv)),\n 1563→ );\n 1564→ });\n 1565→\n 1566→ const ctx = buildBaseContext(selectedConversation);\n 1567→ ctx.customColoringPrompt = editingColoringPrompt;\n 1568→\n 1569→ await processConversationWorkflow(\n 1570→ WorkflowEvent.ColoringPromptChanged,\n 1571→ ctx,\n 1572→ runner,\n 1573→ {},\n 1574→ );\n 1575→\n 1576→ // Store the custom prompt in the conversation state\n 1577→ setConversations((prev) =>\n 1578→ prev.map((conv) =>\n 1579→ conv.id === id\n 1580→ ? { ...conv, customColoringPrompt: editingColoringPrompt }\n 1581→ : conv,\n 1582→ ),\n 1583→ );\n 1584→ } catch (error) {\n 1585→ console.error(\"Failed to reprocess coloring:\", error);\n 1586→ setConversations((prev) =>\n 1587→ prev.map((conv) =>\n 1588→ conv.id === id\n 1589→ ? {\n 1590→ ...conv,\n 1591→ status: \"failed\",\n 1592→ step: undefined,\n 1593→ error: \"Coloring reprocessing failed\",\n 1594→ }\n 1595→ : conv,\n 1596→ ),\n 1597→ );\n 1598→ } finally {\n 1599→ setReprocessingId(null);\n 1600→ }\n 1601→ };\n 1602→\n 1603→ // Sidebar toggle handlers\n 1604→ const handleToggleSidebar = () => {\n 1605→ setSidebarCollapsed(!isSidebarCollapsed);\n 1606→ };\n 1607→\n 1608→ // Insights panel toggle handler\n 1609→ const handleToggleInsightsPanel = () => {\n 1610→ setInsightsCollapsed(!isInsightsPanelCollapsed);\n 1611→ };\n 1612→\n 1613→ // Helper: Build base context from selected conversation\n 1614→ const buildBaseContext = (conv: WorkflowState): WorkflowState => ({\n 1615→ id: conv.id,\n 1616→ filename: conv.filename,\n 1617→ conversation: conv.conversation,\n 1618→ summary: conv.summary,\n 1619→ metadata: conv.metadata,\n 1620→ aiSummary: conv.aiSummary,\n 1621→ analysis: conv.analysis,\n 1622→ components: conv.components,\n 1623→ componentMapping: conv.componentMapping,\n 1624→ componentTimeline: conv.componentTimeline,\n 1625→ componentColors: conv.componentColors,\n 1626→ staticComponents: conv.staticComponents,\n 1627→ staticMapping: conv.staticMapping,\n 1628→ staticTimeline: conv.staticTimeline,\n 1629→ customSummaryPrompt: conv.customSummaryPrompt,\n 1630→ customSegmentationPrompt: conv.customSegmentationPrompt,\n 1631→ customAnalysisPrompt: conv.customAnalysisPrompt,\n 1632→ customColoringPrompt: conv.customColoringPrompt,\n 1633→ segmentationThreshold: conv.segmentationThreshold,\n 1634→ customPrompt: conv.customPrompt,\n 1635→ config: conv.config || getComponentisationConfig(),\n 1636→ warnings: [],\n 1637→ stepTimings: { ...conv.stepTimings },\n 1638→ });\n 1639→\n 1640→ // Helper: Standard analysis chunk callback\n 1641→ const onAnalysisChunk = (id: string, chunk: string) => {\n 1642→ setConversations((prev) =>\n 1643→ prev.map((conv) =>\n 1644→ conv.id === id\n 1645→ ? { ...conv, analysis: (conv.analysis || \"\") + chunk }\n 1646→ : conv,\n 1647→ ),\n 1648→ );\n 1649→ };"
}
]
},
{
"id": "72",
"role": "assistant",
"timestamp": "2026-03-09T18:26:59.922Z",
"parts": [
{
"id": "71",
"type": "tool-call",
"token_count": 31,
"component": "understanding_codebase",
"toolCallId": "toolu_01ShL3tRgXWtZ4qAM61ZVS4M",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 120,
"offset": 1650
}
}
]
},
{
"id": "73",
"role": "tool",
"timestamp": "2026-03-09T18:26:59.949Z",
"parts": [
{
"id": "74",
"type": "tool-result",
"token_count": 1717,
"component": "understanding_codebase",
"toolCallId": "toolu_01ShL3tRgXWtZ4qAM61ZVS4M",
"toolName": "Read",
"output": " 1650→\n 1651→ // Helper: Standard summary chunk callback\n 1652→ const onSummaryChunk = (id: string, chunk: string) => {\n 1653→ setConversations((prev) =>\n 1654→ prev.map((conv) =>\n 1655→ conv.id === id\n 1656→ ? { ...conv, aiSummary: (conv.aiSummary || \"\") + chunk }\n 1657→ : conv,\n 1658→ ),\n 1659→ );\n 1660→ };\n 1661→\n 1662→ // Apply prompts from one conversation to all other completed conversations\n 1663→ const handleApplyPromptsToAll = async (sourceId: string) => {\n 1664→ const source = conversations.find((c) => c.id === sourceId);\n 1665→ if (!source) return;\n 1666→\n 1667→ const promptFields = {\n 1668→ customPrompt: source.customPrompt,\n 1669→ customSegmentationPrompt: source.customSegmentationPrompt,\n 1670→ customSummaryPrompt: source.customSummaryPrompt,\n 1671→ customAnalysisPrompt: source.customAnalysisPrompt,\n 1672→ customColoringPrompt: source.customColoringPrompt,\n 1673→ segmentationThreshold: source.segmentationThreshold,\n 1674→ };\n 1675→\n 1676→ const targets = conversations.filter(\n 1677→ (c) =>\n 1678→ c.id !== sourceId &&\n 1679→ c.status === \"success\" &&\n 1680→ !c.isGrouped &&\n 1681→ c.conversation,\n 1682→ );\n 1683→\n 1684→ if (targets.length === 0) return;\n 1685→\n 1686→ await Promise.all(\n 1687→ targets.map(async (conv) => {\n 1688→ // Determine the earliest changed event to trigger\n 1689→ let event: WorkflowEvent | null = null;\n 1690→ if (promptFields.customSegmentationPrompt !== conv.customSegmentationPrompt ||\n 1691→ promptFields.segmentationThreshold !== conv.segmentationThreshold) {\n 1692→ event = WorkflowEvent.SegmentationPromptChanged;\n 1693→ } else if (promptFields.customPrompt !== conv.customPrompt) {\n 1694→ event = WorkflowEvent.ComponentPromptChanged;\n 1695→ } else if (promptFields.customColoringPrompt !== conv.customColoringPrompt) {\n 1696→ event = WorkflowEvent.ColoringPromptChanged;\n 1697→ }\n 1698→\n 1699→ // Always store the prompt fields on the conversation (summary/analysis prompts take effect on-demand)\n 1700→ setConversations((prev) =>\n 1701→ prev.map((c) =>\n 1702→ c.id === conv.id ? { ...c, ...promptFields } : c,\n 1703→ ),\n 1704→ );\n 1705→\n 1706→ // If no workflow event needed, we're done (only summary/analysis prompts changed)\n 1707→ if (!event) return;\n 1708→\n 1709→ const runner = new WorkflowRunner((id, update) => {\n 1710→ setConversations((prev) =>\n 1711→ prev.map((c) => (c.id === id ? { ...c, ...update } : c)),\n 1712→ );\n 1713→ });\n 1714→\n 1715→ const ctx = buildBaseContext(conv);\n 1716→ ctx.customPrompt = promptFields.customPrompt;\n 1717→ ctx.customSegmentationPrompt = promptFields.customSegmentationPrompt;\n 1718→ ctx.customSummaryPrompt = promptFields.customSummaryPrompt;\n 1719→ ctx.customAnalysisPrompt = promptFields.customAnalysisPrompt;\n 1720→ ctx.customColoringPrompt = promptFields.customColoringPrompt;\n 1721→ ctx.segmentationThreshold = promptFields.segmentationThreshold;\n 1722→\n 1723→ await processConversationWorkflow(event, ctx, runner, {\n 1724→ onAnalysisChunk,\n 1725→ });\n 1726→ }),\n 1727→ );\n 1728→ };\n 1729→\n 1730→ // Export prompts from a conversation as a preset JSON file\n 1731→ const handleExportPromptsAsPreset = (sourceId: string) => {\n 1732→ const source = conversations.find((c) => c.id === sourceId);\n 1733→ if (!source) return;\n 1734→\n 1735→ const defaultName = source.title || source.filename.replace(/\\.[^.]+$/, \"\");\n 1736→ const name = window.prompt(\"Preset name:\", defaultName);\n 1737→ if (!name) return;\n 1738→\n 1739→ const preset: Record<string, unknown> = {\n 1740→ id: `custom-${Date.now()}`,\n 1741→ name,\n 1742→ description: `Exported prompts from \"${name}\"`,\n 1743→ components: source.components || [],\n 1744→ colors: source.componentColors || {},\n 1745→ };\n 1746→\n 1747→ if (source.customSegmentationPrompt) {\n 1748→ preset.segmentationPrompt = source.customSegmentationPrompt;\n 1749→ }\n 1750→ if (source.segmentationThreshold != null) {\n 1751→ preset.segmentationThreshold = source.segmentationThreshold;\n 1752→ }\n 1753→ if (source.customPrompt) {\n 1754→ preset.componentIdentificationPrompt = source.customPrompt;\n 1755→ }\n 1756→ if (source.customColoringPrompt) {\n 1757→ preset.coloringPrompt = source.customColoringPrompt;\n 1758→ }\n 1759→ if (source.customSummaryPrompt) {\n 1760→ preset.summaryPrompt = source.customSummaryPrompt;\n 1761→ }\n 1762→ if (source.customAnalysisPrompt) {\n 1763→ preset.analysisPrompt = source.customAnalysisPrompt;\n 1764→ }\n 1765→\n 1766→ const json = JSON.stringify(preset, null, 2);\n 1767→ const blob = new Blob([json], { type: \"application/json\" });\n 1768→ const url = URL.createObjectURL(blob);\n 1769→ const a = document.createElement(\"a\");"
}
]
},
{
"id": "77",
"role": "assistant",
"timestamp": "2026-03-09T18:27:03.762Z",
"parts": [
{
"id": "75",
"type": "reasoning",
"token_count": 24,
"component": "understanding_codebase",
"text": "Now I have a good understanding. Let me also look at handleReprocessComponents to understand the full reprocessing flow."
},
{
"id": "76",
"type": "tool-call",
"token_count": 39,
"component": "understanding_codebase",
"toolCallId": "toolu_01LvMK2vFk6cGpFEnv9wcJwh",
"toolName": "Grep",
"input": {
"pattern": "handleReprocessComponents",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "78",
"role": "tool",
"timestamp": "2026-03-09T18:27:04.565Z",
"parts": [
{
"id": "79",
"type": "tool-result",
"token_count": 69,
"component": "understanding_codebase",
"toolCallId": "toolu_01LvMK2vFk6cGpFEnv9wcJwh",
"toolName": "Grep",
"output": "1450: await handleReprocessComponents({ customPrompt: editingPrompt });\n1473: await handleReprocessComponents({ customComponents: components });\n1852: const handleReprocessComponents = createReprocessHandler<{\n2866: onReprocessComponents={handleReprocessComponents}"
}
]
},
{
"id": "81",
"role": "assistant",
"timestamp": "2026-03-09T18:27:07.857Z",
"parts": [
{
"id": "80",
"type": "tool-call",
"token_count": 31,
"component": "understanding_codebase",
"toolCallId": "toolu_01SUN9fJfM5pWtz6XTdXRntn",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 100,
"offset": 1790
}
}
]
},
{
"id": "82",
"role": "tool",
"timestamp": "2026-03-09T18:27:07.889Z",
"parts": [
{
"id": "83",
"type": "tool-result",
"token_count": 1280,
"component": "understanding_codebase",
"toolCallId": "toolu_01SUN9fJfM5pWtz6XTdXRntn",
"toolName": "Read",
"output": " 1790→ // Check if this is a grouped conversation\n 1791→ if (\n 1792→ selectedConversation.isGrouped &&\n 1793→ selectedConversation.sourceConversations\n 1794→ ) {\n 1795→ // Get source conversations\n 1796→ const sourceConvs = selectedConversation.sourceConversations\n 1797→ .map((source) => conversations.find((c) => c.id === source.id))\n 1798→ .filter(\n 1799→ (c): c is WorkflowState => c !== null && c?.conversation !== null,\n 1800→ );\n 1801→\n 1802→ // Process all source conversations in parallel\n 1803→ await Promise.all(\n 1804→ sourceConvs.map(async (conv) => {\n 1805→ const runner = new WorkflowRunner((id, update) => {\n 1806→ setConversations((prev) =>\n 1807→ prev.map((c) => (c.id === id ? { ...c, ...update } : c)),\n 1808→ );\n 1809→ });\n 1810→ const ctx = buildBaseContext(conv);\n 1811→ contextModifier(ctx, options);\n 1812→ await processConversationWorkflow(event, ctx, runner, callbacks);\n 1813→ }),\n 1814→ );\n 1815→ return;\n 1816→ }\n 1817→\n 1818→ // Single conversation processing\n 1819→ const runner = new WorkflowRunner((id, update) => {\n 1820→ setConversations((prev) =>\n 1821→ prev.map((conv) =>\n 1822→ conv.id === id ? { ...conv, ...update } : conv,\n 1823→ ),\n 1824→ );\n 1825→ });\n 1826→\n 1827→ const ctx = buildBaseContext(selectedConversation);\n 1828→ contextModifier(ctx, options);\n 1829→\n 1830→ await processConversationWorkflow(event, ctx, runner, callbacks);\n 1831→ } catch (error) {\n 1832→ console.error(`Failed to reprocess: ${errorMessage}`, error);\n 1833→ setConversations((prev) =>\n 1834→ prev.map((conv) =>\n 1835→ conv.id === id\n 1836→ ? {\n 1837→ ...conv,\n 1838→ status: \"failed\",\n 1839→ step: undefined,\n 1840→ error: errorMessage,\n 1841→ }\n 1842→ : conv,\n 1843→ ),\n 1844→ );\n 1845→ } finally {\n 1846→ setReprocessingId(null);\n 1847→ }\n 1848→ };\n 1849→ };\n 1850→\n 1851→ // Reprocess handlers using the factory\n 1852→ const handleReprocessComponents = createReprocessHandler<{\n 1853→ customPrompt?: string;\n 1854→ customComponents?: string[];\n 1855→ }>(\n 1856→ WorkflowEvent.ComponentPromptChanged,\n 1857→ (ctx, options) => {\n 1858→ ctx.customPrompt = options.customPrompt;\n 1859→ ctx.customComponents = options.customComponents;\n 1860→ },\n 1861→ { onAnalysisChunk },\n 1862→ \"Component reprocessing failed\",\n 1863→ );\n 1864→\n 1865→ const handleReprocessSegmentation = createReprocessHandler<{\n 1866→ customSegmentationPrompt?: string;\n 1867→ segmentationThreshold?: number;\n 1868→ }>(\n 1869→ WorkflowEvent.SegmentationPromptChanged,\n 1870→ (ctx, options) => {\n 1871→ ctx.customSegmentationPrompt = options.customSegmentationPrompt;\n 1872→ ctx.segmentationThreshold = options.segmentationThreshold;\n 1873→ },\n 1874→ { onAnalysisChunk },\n 1875→ \"Segmentation reprocessing failed\",\n 1876→ );\n 1877→\n 1878→ // Summary handler has special logic for regenerating analysis\n 1879→ const handleReprocessSummary = async (\n 1880→ options: { customSummaryPrompt?: string } = {},\n 1881→ ) => {\n 1882→ if (!selectedConversation?.conversation) return;\n 1883→\n 1884→ const id = selectedConversation.id;\n 1885→ const shouldRegenerateAnalysis =\n 1886→ !!selectedConversation.analysis ||\n 1887→ selectedConversation.stepTimings?.analysis !== undefined;\n 1888→\n 1889→ setReprocessingId(id);"
}
]
},
{
"id": "86",
"role": "assistant",
"timestamp": "2026-03-09T18:27:10.865Z",
"parts": [
{
"id": "84",
"type": "text",
"token_count": 20,
"component": "task_management",
"text": "This is a large feature. Let me now use the Plan agent to create a proper implementation plan."
},
{
"id": "85",
"type": "tool-call",
"token_count": 832,
"component": "feature_design",
"toolCallId": "toolu_011TdL2o3rmS3Q2ApgCQ4Kjj",
"toolName": "Agent",
"input": {
"subagent_type": "Plan",
"description": "Plan multi-dimension components",
"prompt": "I need to plan the implementation of multi-dimensional componentisation for this codebase. Here's the feature request and what I've learned about the codebase:\n\n## Feature Request\nAllow multiple componentisations per conversation. Currently each segment maps to one component. We want multiple \"dimensions\" per segment.\n\n### Data Model Changes\n- Each componentisation has a \"dimension\" name. Default dimension is \"default\".\n- Mapping per segment: `{default: foo, another: boo, yet_another: goo}` (was just a string)\n- By default only one dimension.\n- Adding a new dimension implies a new name + new prompt.\n\n### LLM Calls\n- Duplicate calls for component mapping per dimension (each LLM call maps one dimension).\n- Editing a prompt should rerun only that dimension's pipeline.\n\n### UI Changes\n- Sidebar: Edit componentisation prompt per dimension. Accordion to switch between dimensions. Can change dimension name or add new dimension.\n- Components view: Dropdown/checkbox to choose which dimension(s) to view. Same in group comparison and single conversation components views.\n- Waffle charts: Component and token % computed statically after componentisation.\n- Colors: Each dimension has its own color scheme. When viewing multiple dimensions together, merge colors using RGB blending. Pure function: given multiple components (and their colors) → blended color.\n- Comparison view: Categories in legend as multiple columns with dimension names as headings.\n\n## Current Architecture\n\n### WorkflowState (App.tsx:98-149)\n```typescript\ninterface WorkflowState {\n // ... identity, UI/lifecycle fields ...\n \n // Current single-dimension component data:\n customPrompt?: string;\n customComponents?: string[];\n components?: string[];\n componentMapping?: Record<string, string>; // partId → componentName\n componentTimeline?: ComponentTimelineSnapshot[];\n componentColors?: Record<string, string>; // componentName → color\n \n // Static (deterministic) - unchanged:\n staticComponents?: string[];\n staticMapping?: Record<string, string>;\n staticTimeline?: ComponentTimelineSnapshot[];\n}\n```\n\n### componentiseConversation (componentisation.ts)\nTakes conversation, runs:\n1. identifyComponents → string[]\n2. mapComponentsToIds → Record<string, string> (partId → component)\n3. buildComponentTimeline → ComponentTimelineSnapshot[]\n\n### Workflow (App.tsx)\n- `findComponentsActivity` calls `componentiseConversation`\n- `assignColorsActivity` calls `assignComponentColors`\n- WorkflowEvent.ComponentPromptChanged reruns finding-components + coloring\n- PromptEditorDialog allows editing the component identification prompt\n- `handleReprocessComponents` triggers the rerun\n\n### UI Components\n- ComponentsView: Shows waffle chart + timeline slider, takes componentMapping, componentTimeline, componentColors\n- ComponentComparisonView: Takes ConversationComponentData[] with componentTokens, totalTokens per conversation\n- WaffleChart: Renders 20x20 grid from component data\n- PromptEditorDialog: Generic dialog for editing prompts\n\n### Color System (lib/component-colors.ts)\n- Maps color names to hex, tailwind classes, etc.\n- Already has hexToRgb/rgbToHex utilities\n\n## Design the implementation plan\n\nKey considerations:\n1. We need to maintain backward compatibility - existing single-dimension workflows should still work seamlessly (the \"default\" dimension).\n2. The data model change is the most fundamental - everything flows from it.\n3. The LLM pipeline per dimension is basically the same as today, just keyed by dimension.\n4. The UI needs to allow selecting/viewing multiple dimensions.\n\nPlease provide a step-by-step implementation plan with file-by-file changes."
}
}
]
},
{
"id": "87",
"role": "tool",
"timestamp": "2026-03-09T18:29:52.014Z",
"parts": [
{
"id": "88",
"type": "tool-result",
"token_count": 3320,
"component": "feature_design",
"toolCallId": "toolu_011TdL2o3rmS3Q2ApgCQ4Kjj",
"toolName": "Agent",
"output": [
{
"type": "text",
"text": "I have a comprehensive understanding of the codebase. Here is the implementation plan.\n\n---\n\n## Multi-Dimensional Componentisation: Implementation Plan\n\n### Overview\n\nThe core idea is to go from a single set of component data (`components`, `componentMapping`, `componentColors`, `componentTimeline`) to a dictionary keyed by dimension name. A \"dimension\" is a named componentisation perspective, each with its own prompt, component list, mapping, colors, and timeline. The default dimension is `\"default\"`.\n\n---\n\n### Phase 1: Data Model (Foundation)\n\n**1.1 Define the `DimensionData` type**\n\nIn `/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts`, add a new interface:\n\n```typescript\nexport interface DimensionData {\n name: string;\n prompt?: string; // custom prompt for this dimension\n components: string[];\n componentMapping: Record<string, string>; // partId -> componentName\n componentTimeline: ComponentTimelineSnapshot[];\n componentColors: Record<string, string>; // componentName -> color\n customComponents?: string[];\n customColoringPrompt?: string;\n}\n```\n\n**1.2 Update `WorkflowState` in `/Users/srihari/work/nilenso/context-viewer/src/App.tsx`**\n\nAdd a new field while keeping old fields for backward compatibility during migration:\n\n```typescript\ninterface WorkflowState {\n // ... existing fields ...\n \n // NEW: Multi-dimensional component data\n dimensions?: Record<string, DimensionData>; // dimensionName -> data\n \n // DEPRECATED (keep for backward compat during migration, then remove):\n // components, componentMapping, componentTimeline, componentColors, customPrompt, customComponents\n}\n```\n\n**Migration strategy**: On load, if `dimensions` is undefined but old fields are populated, create a `dimensions: { default: { ...oldFields } }` entry. A helper function `migrateToDimensions(state: WorkflowState): Record<string, DimensionData>` handles this.\n\n**Accessor helpers**: Create `getActiveDimensions(state)`, `getDimensionData(state, dimensionName)`, and `getPrimaryDimension(state)` to centralize access and hide migration logic.\n\n---\n\n### Phase 2: LLM Pipeline Per Dimension\n\n**2.1 Update `componentiseConversation` in `/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts`**\n\nNo signature change needed -- this function already takes a `customPrompt` and returns `{ components, mapping, timeline }`. Each dimension call is just a separate invocation with a different prompt. The orchestration happens at the workflow level.\n\n**2.2 Update `findComponentsActivity` in `/Users/srihari/work/nilenso/context-viewer/src/App.tsx`**\n\nCreate a new `findComponentsForDimensionActivity` that takes a dimension name and its prompt, runs `componentiseConversation`, and returns `DimensionData` (minus colors, which come from a separate step).\n\nCreate a wrapper `findAllDimensionsActivity` that iterates over all dimensions in `ctx.dimensions`, runs `findComponentsForDimensionActivity` for each, and merges results back. Dimensions can be processed in parallel since they are independent.\n\n**2.3 Update `assignColorsActivity`**\n\nSimilarly, iterate over all dimensions and assign colors per dimension independently. Each dimension gets its own color scheme.\n\n**2.4 Update `processConversationWorkflow`**\n\nFor `WorkflowEvent.ComponentPromptChanged`, introduce a new event variant or add a `dimensionName` field to the context so that only the affected dimension is rerun:\n\n```typescript\n// Add to WorkflowState:\ntargetDimension?: string; // When set, only reprocess this dimension\n```\n\nWhen `targetDimension` is set during `ComponentPromptChanged`, only run the pipeline for that dimension. When unset (or on `NewFile`), run all dimensions.\n\n**2.5 New `WorkflowEvent.DimensionAdded` and `WorkflowEvent.DimensionRemoved`**\n\n- `DimensionAdded`: Runs componentisation + coloring for just the new dimension.\n- `DimensionRemoved`: Just removes the dimension from `ctx.dimensions` and marks complete.\n\n---\n\n### Phase 3: Color Blending\n\n**3.1 Add blending utilities to `/Users/srihari/work/nilenso/context-viewer/src/lib/component-colors.ts`**\n\nAdd a pure function:\n\n```typescript\nexport function blendColors(hexColors: string[]): string {\n // Average RGB components\n const rgbs = hexColors.map(hexToRgb);\n const avg = {\n r: Math.round(rgbs.reduce((s, c) => s + c.r, 0) / rgbs.length),\n g: Math.round(rgbs.reduce((s, c) => s + c.g, 0) / rgbs.length),\n b: Math.round(rgbs.reduce((s, c) => s + c.b, 0) / rgbs.length),\n };\n return rgbToHex(avg.r, avg.g, avg.b);\n}\n```\n\nAdd a higher-level helper:\n\n```typescript\nexport function getBlendedColorForPart(\n partId: string,\n dimensions: Record<string, DimensionData>,\n activeDimensionNames: string[],\n): string {\n const colors = activeDimensionNames\n .map(dim => {\n const dimData = dimensions[dim];\n if (!dimData) return null;\n const component = dimData.componentMapping[partId];\n if (!component) return null;\n return getComponentWaffleHex(component, dimData.componentColors);\n })\n .filter(Boolean) as string[];\n \n if (colors.length === 0) return colorNameToWaffleHex.gray!;\n if (colors.length === 1) return colors[0];\n return blendColors(colors);\n}\n```\n\n---\n\n### Phase 4: UI Changes\n\n**4.1 Dimension Selector State**\n\nIn `/Users/srihari/work/nilenso/context-viewer/src/App.tsx`, add state:\n\n```typescript\nconst [activeDimensions, setActiveDimensions] = useState<Set<string>>(new Set([\"default\"]));\n```\n\nThis is the set of dimensions currently being viewed. Pass this down to view components.\n\n**4.2 Sidebar: Dimension Management Accordion**\n\nIn the sidebar area of `App.tsx` (around line 2850+), replace the single \"Edit Componentisation Prompt\" button with an accordion component. Each dimension gets its own section with:\n- Dimension name (editable inline)\n- \"Edit Prompt\" button (opens `PromptEditorDialog` scoped to that dimension)\n- \"Remove\" button (with confirmation)\n- At the bottom: \"Add Dimension\" button\n\nThe `PromptEditorDialog` component (`/Users/srihari/work/nilenso/context-viewer/src/components/PromptEditorDialog.tsx`) does not need changes -- it is already generic. The parent just needs to pass the right prompt and the right `onApply` callback scoped to the dimension.\n\n**4.3 Update `ComponentsView` (`/Users/srihari/work/nilenso/context-viewer/src/components/ComponentsView.tsx`)**\n\nAdd a dimension selector (dropdown/checkbox list) at the top. Props change:\n\n```typescript\ninterface ComponentsViewProps {\n dimensions?: Record<string, DimensionData>;\n activeDimensionNames: string[];\n onActiveDimensionsChange: (dims: string[]) => void;\n // ... keep existing props for backward compat during transition\n conversation: Conversation;\n selectedComponent?: string | null;\n onComponentSelect?: (component: string | null) => void;\n staticMapping?: Record<string, string>;\n filterByStaticComponent?: string | null;\n messageTypeFilters?: Set<string>;\n}\n```\n\nWhen a single dimension is active, behavior is identical to today. When multiple are active, the waffle chart shows blended colors and the legend shows components from all active dimensions (grouped by dimension).\n\n**4.4 Update `ComponentComparisonView` (`/Users/srihari/work/nilenso/context-viewer/src/components/ComponentComparisonView.tsx`)**\n\n`ConversationComponentData` gains:\n\n```typescript\nexport interface ConversationComponentData {\n // ... existing fields ...\n dimensionData?: Record<string, {\n componentTokens: Record<string, number>;\n messageComponents?: string[];\n }>;\n}\n```\n\nAdd dimension selector. When viewing multiple dimensions, the legend shows columns grouped by dimension name as headings.\n\n**4.5 Update `WaffleChart` (`/Users/srihari/work/nilenso/context-viewer/src/components/WaffleChart.tsx`)**\n\nThe `WaffleChart` is already generic (takes `getColorStyles` callback). No change needed to the component itself -- the caller just passes a blended `getColorStyles` function when multiple dimensions are active.\n\n**4.6 Update `MessagePartView` (`/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx`)**\n\nCurrently shows a single component badge per part. With multiple dimensions, show one badge per active dimension (stacked or inline). The badge labels become `dimensionName: componentName`.\n\nProps change from `componentMapping?: Record<string, string>` to `dimensions?: Record<string, DimensionData>; activeDimensionNames?: string[]`.\n\n**4.7 Update `MessageView` (`/Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx`)**\n\nPass through the new dimension props to `MessagePartView`.\n\n---\n\n### Phase 5: Export/Import Compatibility\n\n**5.1 Update `/Users/srihari/work/nilenso/context-viewer/src/lib/export-schema.ts`**\n\nAdd dimension support to the export format:\n\n```typescript\nexport const DimensionExportSchema = z.object({\n name: z.string(),\n prompt: z.string().optional(),\n coloringPrompt: z.string().optional(),\n colors: z.record(z.string(), z.string()),\n});\n\n// Update FileExportSchema to include dimensions (optional for backward compat)\nexport const FileExportSchema = z.object({\n // ... existing fields ...\n dimensions: z.array(DimensionExportSchema).optional(),\n});\n```\n\nEach part in the export gets `dimensions?: Record<string, string>` (dimensionName -> componentName) alongside the existing `component` field.\n\n**5.2 Update `/Users/srihari/work/nilenso/context-viewer/src/lib/export-builder.ts`**\n\nBuild dimension data into the export. Fall back to single-dimension behavior when dimensions are absent.\n\n**5.3 Update Context Viewer parser**\n\nIn `/Users/srihari/work/nilenso/context-viewer/src/parsers/context-viewer-parser.ts`, when importing, reconstruct `dimensions` from the export format. If the export has no `dimensions` field, fall back to the old single-dimension import path.\n\n---\n\n### Phase 6: Preset Support\n\n**6.1 Update `/Users/srihari/work/nilenso/context-viewer/src/lib/preset-loader.ts`**\n\nExtend `PresetConfig` to support per-dimension presets:\n\n```typescript\ninterface PresetConfig {\n // ... existing single-dimension fields (backward compat) ...\n dimensions?: Array<{\n name: string;\n componentIdentificationPrompt?: string;\n components?: string[];\n colors?: Record<string, string>;\n coloringPrompt?: string;\n }>;\n}\n```\n\n---\n\n### Implementation Order\n\n1. **Phase 1** (Data Model) -- must come first, everything depends on it\n2. **Phase 2** (LLM Pipeline) -- enables multi-dimension processing\n3. **Phase 3** (Color Blending) -- needed before UI can render multi-dimension views\n4. **Phase 4.2** (Sidebar) -- enables adding/editing dimensions\n5. **Phase 4.3-4.7** (View Components) -- can be done incrementally\n6. **Phase 5** (Export/Import) -- can be deferred; existing exports still work\n7. **Phase 6** (Presets) -- last, least urgent\n\n### Key Design Decisions\n\n1. **Parallel dimension processing**: Since dimensions are independent, all dimension LLM calls can run in parallel (using `Promise.all`). This keeps latency constant regardless of dimension count.\n\n2. **Selective reprocessing**: Editing a dimension's prompt only reruns that dimension's pipeline. This is achieved by adding `targetDimension` to the workflow context and checking it in the workflow runner.\n\n3. **Backward compatibility**: The old single-field format is always interpretable as `dimensions: { default: ... }`. Migration is done lazily via accessor helpers, so no data migration step is needed.\n\n4. **Color blending as a pure function**: Given N dimension colors for a part, produce one blended hex. This keeps the waffle chart and part views simple -- they just call a function rather than managing complex multi-color rendering.\n\n5. **Additive UI model**: The dimension selector is additive -- you can view 1 or N dimensions simultaneously. The default state is a single \"default\" dimension, which is identical to the current behavior.\n\n---\n\n### Critical Files for Implementation\n\n- `/Users/srihari/work/nilenso/context-viewer/src/App.tsx` - Central state management: WorkflowState interface, workflow events, reprocess handlers, and all the plumbing that connects dimensions to UI components\n- `/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts` - DimensionData type definition; the LLM pipeline functions (identifyComponents, mapComponentsToIds, assignComponentColors) that need per-dimension orchestration\n- `/Users/srihari/work/nilenso/context-viewer/src/lib/component-colors.ts` - Color blending utilities (blendColors, getBlendedColorForPart) that enable multi-dimension visualization\n- `/Users/srihari/work/nilenso/context-viewer/src/components/ComponentsView.tsx` - Primary single-conversation component view that needs dimension selector, blended waffle charts, and per-dimension legends\n- `/Users/srihari/work/nilenso/context-viewer/src/components/ComponentComparisonView.tsx` - Group comparison view that needs dimension selector and multi-column legend with dimension headings"
},
{
"type": "text",
"text": "agentId: addcdbaa28ca1bbad (for resuming to continue this agent's work if needed)\n<usage>total_tokens: 74098\ntool_uses: 29\nduration_ms: 137491</usage>"
}
]
}
]
},
{
"id": "92",
"role": "assistant",
"timestamp": "2026-03-09T18:29:57.705Z",
"parts": [
{
"id": "89",
"type": "text",
"token_count": 41,
"component": "task_management",
"text": "Good plan. This is a large feature — I'll implement it in phases, starting with the data model and working through the pipeline and UI. Let me begin.\n\n## Phase 1: Data Model + Pipeline"
},
{
"id": "90",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_016SA661Gr9oG4xNaVrZcj3i",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts",
"limit": 20,
"offset": 310
}
},
{
"id": "91",
"type": "tool-call",
"token_count": 24,
"component": "understanding_codebase",
"toolCallId": "toolu_01KPpP4ncfTVJ1g4pKUH7T8p",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/lib/component-colors.ts"
}
}
]
},
{
"id": "93",
"role": "tool",
"timestamp": "2026-03-09T18:29:58.714Z",
"parts": [
{
"id": "94",
"type": "tool-result",
"token_count": 234,
"component": "understanding_codebase",
"toolCallId": "toolu_016SA661Gr9oG4xNaVrZcj3i",
"toolName": "Read",
"output": " 310→/**\n 311→ * Timeline snapshot representing component composition at a specific message\n 312→ */\n 313→export interface ComponentTimelineSnapshot {\n 314→ messageIndex: number;\n 315→ componentTokens: Record<string, number>; // component name → total tokens\n 316→ totalTokens: number; // cumulative tokens up to this message\n 317→}\n 318→\n 319→/**\n 320→ * Build a timeline of component composition for each message in the conversation\n 321→ * This allows scrubbing through the conversation to see how components evolve\n 322→ */\n 323→export function buildComponentTimeline(\n 324→ conversation: Conversation,\n 325→ componentMapping: Record<string, string>,\n 326→ conversationId?: string,\n 327→): ComponentTimelineSnapshot[] {\n 328→ log(conversationId, \"Building component timeline\");\n 329→"
}
]
},
{
"id": "95",
"role": "tool",
"timestamp": "2026-03-09T18:29:59.008Z",
"parts": [
{
"id": "96",
"type": "tool-result",
"token_count": 4338,
"component": "understanding_codebase",
"toolCallId": "toolu_01KPpP4ncfTVJ1g4pKUH7T8p",
"toolName": "Read",
"output": " 1→/**\n 2→ * Shared color utilities for components across different views\n 3→ */\n 4→\n 5→// Map color names to Tailwind CSS classes (legacy support)\n 6→export const colorNameToClasses: Record<string, string> = {\n 7→ orange: \"bg-orange-100 text-orange-700 border-orange-300\",\n 8→ emerald: \"bg-emerald-100 text-emerald-700 border-emerald-300\",\n 9→ purple: \"bg-purple-100 text-purple-700 border-purple-300\",\n 10→ blue: \"bg-blue-100 text-blue-700 border-blue-300\",\n 11→ slate: \"bg-slate-100 text-slate-700 border-slate-300\",\n 12→ indigo: \"bg-indigo-100 text-indigo-700 border-indigo-300\",\n 13→ gray: \"bg-gray-100 text-gray-700 border-gray-300\",\n 14→ cyan: \"bg-cyan-100 text-cyan-700 border-cyan-300\",\n 15→ teal: \"bg-teal-100 text-teal-700 border-teal-300\",\n 16→ rose: \"bg-rose-100 text-rose-700 border-rose-300\",\n 17→ amber: \"bg-amber-100 text-amber-700 border-amber-300\",\n 18→ violet: \"bg-violet-100 text-violet-700 border-violet-300\",\n 19→ lime: \"bg-lime-100 text-lime-700 border-lime-300\",\n 20→ sky: \"bg-sky-100 text-sky-700 border-sky-300\",\n 21→};\n 22→\n 23→// Map color names to just background Tailwind CSS classes (for WaffleChart)\n 24→export const colorNameToBgClass: Record<string, string> = {\n 25→ orange: \"bg-orange-400\",\n 26→ emerald: \"bg-emerald-400\",\n 27→ purple: \"bg-purple-400\",\n 28→ blue: \"bg-blue-400\",\n 29→ slate: \"bg-slate-400\",\n 30→ indigo: \"bg-indigo-400\",\n 31→ gray: \"bg-gray-400\",\n 32→ cyan: \"bg-cyan-400\",\n 33→ teal: \"bg-teal-400\",\n 34→ rose: \"bg-rose-400\",\n 35→ amber: \"bg-amber-400\",\n 36→ violet: \"bg-violet-500\",\n 37→ lime: \"bg-lime-400\",\n 38→ sky: \"bg-sky-400\",\n 39→};\n 40→\n 41→// Map color names to hex codes for charts (light background)\n 42→export const colorNameToHex: Record<string, string> = {\n 43→ orange: \"#fed7aa\",\n 44→ emerald: \"#a7f3d0\",\n 45→ purple: \"#e9d5ff\",\n 46→ blue: \"#bfdbfe\",\n 47→ slate: \"#cbd5e1\",\n 48→ indigo: \"#c7d2fe\",\n 49→ gray: \"#d1d5db\",\n 50→ cyan: \"#cffafe\",\n 51→ teal: \"#ccfbf1\",\n 52→ rose: \"#ffe4e6\",\n 53→ amber: \"#fef3c7\",\n 54→ violet: \"#ede9fe\",\n 55→ lime: \"#ecfccb\",\n 56→ sky: \"#e0f2fe\",\n 57→};\n 58→\n 59→// Map color names to hex codes for text/labels (darker for readability)\n 60→export const colorNameToTextHex: Record<string, string> = {\n 61→ orange: \"#c2410c\",\n 62→ emerald: \"#047857\",\n 63→ purple: \"#7e22ce\",\n 64→ blue: \"#1d4ed8\",\n 65→ slate: \"#334155\",\n 66→ indigo: \"#4338ca\",\n 67→ gray: \"#374151\",\n 68→ cyan: \"#0e7490\",\n 69→ teal: \"#0f766e\",\n 70→ rose: \"#be123c\",\n 71→ amber: \"#b45309\",\n 72→ violet: \"#6d28d9\",\n 73→ lime: \"#4d7c0f\",\n 74→ sky: \"#0369a1\",\n 75→};\n 76→\n 77→// Map color names to waffle hex codes (the 400/500 level - more saturated)\n 78→export const colorNameToWaffleHex: Record<string, string> = {\n 79→ orange: \"#fb923c\",\n 80→ emerald: \"#34d399\",\n 81→ purple: \"#c084fc\",\n 82→ blue: \"#60a5fa\",\n 83→ slate: \"#94a3b8\",\n 84→ indigo: \"#818cf8\",\n 85→ gray: \"#9ca3af\",\n 86→ cyan: \"#22d3ee\",\n 87→ teal: \"#2dd4bf\",\n 88→ rose: \"#fb7185\",\n 89→ amber: \"#fbbf24\",\n 90→ violet: \"#8b5cf6\",\n 91→ lime: \"#a3e635\",\n 92→ sky: \"#38bdf8\",\n 93→};\n 94→\n 95→/**\n 96→ * Check if a value is a hex color (starts with #)\n 97→ */\n 98→export function isHexColor(value: string): boolean {\n 99→ return value.startsWith(\"#\");\n 100→}\n 101→\n 102→/**\n 103→ * Convert hex color to RGB components\n 104→ */\n 105→export function hexToRgb(hex: string): { r: number; g: number; b: number } {\n 106→ const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n 107→ if (!result) {\n 108→ return { r: 156, g: 163, b: 175 }; // gray-400 fallback\n 109→ }\n 110→ return {\n 111→ r: parseInt(result[1]!, 16),\n 112→ g: parseInt(result[2]!, 16),\n 113→ b: parseInt(result[3]!, 16),\n 114→ };\n 115→}\n 116→\n 117→/**\n 118→ * Convert RGB to hex color\n 119→ */\n 120→export function rgbToHex(r: number, g: number, b: number): string {\n 121→ const toHex = (n: number) => {\n 122→ const clamped = Math.max(0, Math.min(255, Math.round(n)));\n 123→ return clamped.toString(16).padStart(2, \"0\");\n 124→ };\n 125→ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n 126→}\n 127→\n 128→/**\n 129→ * Lighten a hex color by mixing with white\n 130→ * @param hex The hex color to lighten\n 131→ * @param amount Amount to lighten (0-1, where 1 is white)\n 132→ */\n 133→export function lightenColor(hex: string, amount: number): string {\n 134→ const { r, g, b } = hexToRgb(hex);\n 135→ return rgbToHex(\n 136→ r + (255 - r) * amount,\n 137→ g + (255 - g) * amount,\n 138→ b + (255 - b) * amount\n 139→ );\n 140→}\n 141→\n 142→/**\n 143→ * Darken a hex color by mixing with black\n 144→ * @param hex The hex color to darken\n 145→ * @param amount Amount to darken (0-1, where 1 is black)\n 146→ */\n 147→export function darkenColor(hex: string, amount: number): string {\n 148→ const { r, g, b } = hexToRgb(hex);\n 149→ return rgbToHex(r * (1 - amount), g * (1 - amount), b * (1 - amount));\n 150→}\n 151→\n 152→/**\n 153→ * Get color styles from a hex color for badges\n 154→ * Returns CSS style object with lightened background, darkened text, and border\n 155→ */\n 156→export function getBadgeStylesFromHex(hex: string): {\n 157→ backgroundColor: string;\n 158→ color: string;\n 159→ borderColor: string;\n 160→} {\n 161→ return {\n 162→ backgroundColor: lightenColor(hex, 0.7), // Very light background\n 163→ color: darkenColor(hex, 0.3), // Darker text for readability\n 164→ borderColor: lightenColor(hex, 0.4), // Medium border\n 165→ };\n 166→}\n 167→\n 168→/**\n 169→ * Get waffle/chart background style from a hex color\n 170→ */\n 171→export function getWaffleStyleFromHex(hex: string): { backgroundColor: string } {\n 172→ return { backgroundColor: hex };\n 173→}\n 174→\n 175→/**\n 176→ * Get component color classes based on AI assignment or fallback to gray.\n 177→ * Returns null if the color is a hex value (caller should use inline styles).\n 178→ */\n 179→export function getComponentColorClasses(\n 180→ component: string,\n 181→ componentColors?: Record<string, string>\n 182→): string | null {\n 183→ const colorValue = componentColors?.[component];\n 184→ if (colorValue) {\n 185→ // If it's a hex color, return null - caller should use inline styles\n 186→ if (isHexColor(colorValue)) {\n 187→ return null;\n 188→ }\n 189→ return colorNameToClasses[colorValue] ?? colorNameToClasses.gray!;\n 190→ }\n 191→ return colorNameToClasses.gray!;\n 192→}\n 193→\n 194→/**\n 195→ * Get badge styles for a component. Returns either Tailwind classes or inline styles.\n 196→ */\n 197→export function getComponentBadgeStyles(\n 198→ component: string,\n 199→ componentColors?: Record<string, string>\n 200→): { classes: string | null; style: React.CSSProperties | null } {\n 201→ const colorValue = componentColors?.[component];\n 202→ if (colorValue) {\n 203→ if (isHexColor(colorValue)) {\n 204→ return {\n 205→ classes: null,\n 206→ style: getBadgeStylesFromHex(colorValue),\n 207→ };\n 208→ }\n 209→ return {\n 210→ classes: colorNameToClasses[colorValue] ?? colorNameToClasses.gray!,\n 211→ style: null,\n 212→ };\n 213→ }\n 214→ return {\n 215→ classes: colorNameToClasses.gray!,\n 216→ style: null,\n 217→ };\n 218→}\n 219→\n 220→/**\n 221→ * Get component color hex code based on AI assignment or fallback to gray\n 222→ * For charts - returns the light background hex\n 223→ */\n 224→export function getComponentColorHex(\n 225→ component: string,\n 226→ componentColors?: Record<string, string>\n 227→): string {\n 228→ const colorValue = componentColors?.[component];\n 229→ if (colorValue) {\n 230→ // If it's already a hex color, lighten it for chart background\n 231→ if (isHexColor(colorValue)) {\n 232→ return lightenColor(colorValue, 0.7);\n 233→ }\n 234→ return colorNameToHex[colorValue] ?? colorNameToHex.gray!;\n 235→ }\n 236→ return colorNameToHex.gray!;\n 237→}\n 238→\n 239→/**\n 240→ * Get component text color hex code based on AI assignment or fallback to gray\n 241→ */\n 242→export function getComponentTextColorHex(\n 243→ component: string,\n 244→ componentColors?: Record<string, string>\n 245→): string {\n 246→ const colorValue = componentColors?.[component];\n 247→ if (colorValue) {\n 248→ // If it's a hex color, darken it for text\n 249→ if (isHexColor(colorValue)) {\n 250→ return darkenColor(colorValue, 0.3);\n 251→ }\n 252→ return colorNameToTextHex[colorValue] ?? colorNameToTextHex.gray!;\n 253→ }\n 254→ return colorNameToTextHex.gray!;\n 255→}\n 256→\n 257→/**\n 258→ * Get component background class for WaffleChart based on AI assignment or fallback to gray.\n 259→ * Returns null if the color is a hex value (caller should use inline styles).\n 260→ */\n 261→export function getComponentBgClass(\n 262→ component: string,\n 263→ componentColors?: Record<string, string>\n 264→): string | null {\n 265→ const colorValue = componentColors?.[component];\n 266→ if (colorValue) {\n 267→ // If it's a hex color, return null - caller should use inline styles\n 268→ if (isHexColor(colorValue)) {\n 269→ return null;\n 270→ }\n 271→ return colorNameToBgClass[colorValue] ?? colorNameToBgClass.gray!;\n 272→ }\n 273→ return colorNameToBgClass.gray!;\n 274→}\n 275→\n 276→/**\n 277→ * Get waffle/chart background styles for a component.\n 278→ * Returns either Tailwind class or inline style object.\n 279→ */\n 280→export function getComponentWaffleStyles(\n 281→ component: string,\n 282→ componentColors?: Record<string, string>\n 283→): { classes: string | null; style: React.CSSProperties | null } {\n 284→ const colorValue = componentColors?.[component];\n 285→ if (colorValue) {\n 286→ if (isHexColor(colorValue)) {\n 287→ return {\n 288→ classes: null,\n 289→ style: getWaffleStyleFromHex(colorValue),\n 290→ };\n 291→ }\n 292→ return {\n 293→ classes: colorNameToBgClass[colorValue] ?? colorNameToBgClass.gray!,\n 294→ style: null,\n 295→ };\n 296→ }\n 297→ return {\n 298→ classes: colorNameToBgClass.gray!,\n 299→ style: null,\n 300→ };\n 301→}\n 302→\n 303→/**\n 304→ * Get the raw waffle hex for a component (the main saturated color).\n 305→ * Used for charts and visualizations where we need the actual hex value.\n 306→ */\n 307→export function getComponentWaffleHex(\n 308→ component: string,\n 309→ componentColors?: Record<string, string>\n 310→): string {\n 311→ const colorValue = componentColors?.[component];\n 312→ if (colorValue) {\n 313→ // If it's already a hex color, return it directly\n 314→ if (isHexColor(colorValue)) {\n 315→ return colorValue;\n 316→ }\n 317→ return colorNameToWaffleHex[colorValue] ?? colorNameToWaffleHex.gray!;\n 318→ }\n 319→ return colorNameToWaffleHex.gray!;\n 320→}\n 321→"
}
]
},
{
"id": "100",
"role": "assistant",
"timestamp": "2026-03-09T18:30:01.854Z",
"parts": [
{
"id": "97",
"type": "text",
"token_count": 21,
"component": "understanding_codebase",
"text": "Now let me look at how the sidebar prompt buttons are rendered and the ConversationView that passes component props."
},
{
"id": "98",
"type": "tool-call",
"token_count": 31,
"component": "understanding_codebase",
"toolCallId": "toolu_01BBwcBsrhVofKWaDEPUywK7",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 200,
"offset": 2800
}
},
{
"id": "99",
"type": "tool-call",
"token_count": 46,
"component": "understanding_codebase",
"toolCallId": "toolu_01XgH9oHCooHE1BcqXKW84Q8",
"toolName": "Grep",
"input": {
"pattern": "componentMapping=|componentTimeline=|componentColors=",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "101",
"role": "tool",
"timestamp": "2026-03-09T18:30:03.696Z",
"parts": [
{
"id": "102",
"type": "tool-result",
"token_count": 2983,
"component": "understanding_codebase",
"toolCallId": "toolu_01BBwcBsrhVofKWaDEPUywK7",
"toolName": "Read",
"output": " 2800→ )}\n 2801→ </div>\n 2802→ ) : (\n 2803→ /* Main Content */\n 2804→ <div\n 2805→ className={cn(\n 2806→ \"grid gap-6 transition-all duration-300\",\n 2807→ // Grid columns based on sidebar and insights panel collapse state\n 2808→ isSidebarCollapsed && isInsightsPanelCollapsed\n 2809→ ? \"grid-cols-[48px_1fr_48px]\"\n 2810→ : isSidebarCollapsed && !isInsightsPanelCollapsed\n 2811→ ? \"grid-cols-[48px_minmax(600px,1fr)_minmax(480px,32%)]\"\n 2812→ : !isSidebarCollapsed && isInsightsPanelCollapsed\n 2813→ ? \"grid-cols-[260px_1fr_48px]\"\n 2814→ : \"grid-cols-[260px_minmax(500px,1fr)_minmax(420px,30%)]\",\n 2815→ )}\n 2816→ >\n 2817→ {/* Sidebar: Conversation List */}\n 2818→ <aside className=\"relative\">\n 2819→ <ConversationList\n 2820→ conversations={conversations}\n 2821→ selectedId={selectedId}\n 2822→ onSelect={setSelectedId}\n 2823→ selectedIds={selectedIds}\n 2824→ onToggleSelection={handleToggleSelection}\n 2825→ onGroupConversations={handleGroupConversations}\n 2826→ onClearSelection={handleClearSelection}\n 2827→ onSelectAll={handleSelectAll}\n 2828→ onUngroupConversation={handleUngroupConversation}\n 2829→ onDeleteConversation={handleDeleteConversation}\n 2830→ onRename={handleRenameConversation}\n 2831→ onGenerateAnalysis={handleGenerateAnalysis}\n 2832→ onGenerateSummary={handleGenerateSummary}\n 2833→ onFilesSelected={(files) => workflowMutation.mutate({ files })}\n 2834→ onEditPrompt={handleOpenPromptEditor}\n 2835→ onEditComponents={handleOpenComponentsEditor}\n 2836→ onEditSegmentationPrompt={handleOpenSegmentationPromptEditor}\n 2837→ onEditSummaryPrompt={handleOpenSummaryPromptEditor}\n 2838→ onEditAnalysisPrompt={handleOpenAnalysisPromptEditor}\n 2839→ onEditColoringPrompt={handleOpenColoringPromptEditor}\n 2840→ onApplyPromptsToAll={handleApplyPromptsToAll}\n 2841→ onExportPromptsAsPreset={handleExportPromptsAsPreset}\n 2842→ onExportSession={handleExportSession}\n 2843→ onUpdateGroupSources={handleUpdateGroupSources}\n 2844→ isCollapsed={isSidebarCollapsed}\n 2845→ onToggleCollapse={handleToggleSidebar}\n 2846→ pausedWorkflowCount={pausedWorkflowCount}\n 2847→ onApiKeyChange={handleApiKeyChange}\n 2848→ onResumeWorkflows={handleResumeWorkflowsWithApiKey}\n 2849→ />\n 2850→ </aside>\n 2851→\n 2852→ {/* Main Panel: Conversation View */}\n 2853→ <main>\n 2854→ {selectedConversation ? (\n 2855→ selectedConversation.conversation ? (\n 2856→ // Show conversation as soon as it's available (even if still processing tokens/summary)\n 2857→ <ConversationView\n 2858→ conversation={selectedConversation.conversation}\n 2859→ componentMapping={selectedConversation.componentMapping}\n 2860→ componentTimeline={selectedConversation.componentTimeline}\n 2861→ componentColors={selectedConversation.componentColors}\n 2862→ components={selectedConversation.components}\n 2863→ staticMapping={selectedConversation.staticMapping}\n 2864→ staticTimeline={selectedConversation.staticTimeline}\n 2865→ warnings={selectedConversation.warnings}\n 2866→ onReprocessComponents={handleReprocessComponents}\n 2867→ isReprocessing={reprocessingId === selectedConversation.id}\n 2868→ messageSourceMap={selectedConversation.messageSourceMap}\n 2869→ isGrouped={selectedConversation.isGrouped}\n 2870→ groupTitle={selectedConversation.title}\n 2871→ onConversationClick={setSelectedId}\n 2872→ sourceConversationComponents={sourceConversationComponents}\n 2873→ sourceWorkflowStates={sourceWorkflowStates}\n 2874→ // URL-controlled state\n 2875→ activeTab={urlState.tab as TabType}\n 2876→ onTabChange={(tab) => navigateToTab(tab)}\n 2877→ searchQuery={urlState.searchQuery}\n 2878→ onSearchQueryChange={setSearchQuery}\n 2879→ sortBy={urlState.sort as SortOption}\n 2880→ onSortByChange={setSort}\n 2881→ messageFilters={urlState.messageFilters}\n 2882→ onMessageFiltersChange={setMessageFilters}\n 2883→ selectedComponents={urlState.componentFilters}\n 2884→ onSelectedComponentsChange={setComponentFilters}\n 2885→ // Comparison tab state\n 2886→ comparisonViewMode={urlState.comparisonView}\n 2887→ onComparisonViewModeChange={setComparisonView}\n 2888→ comparisonLegendMode={urlState.comparisonLegend}\n 2889→ onComparisonLegendModeChange={setComparisonLegend}\n 2890→ comparisonSortField={urlState.comparisonSortBy}\n 2891→ onComparisonSortFieldChange={setComparisonSortBy}\n 2892→ comparisonSortDirection={urlState.comparisonSortDir}\n 2893→ onComparisonSortDirectionChange={setComparisonSortDir}\n 2894→ comparisonColumnCount={urlState.comparisonCols}\n 2895→ onComparisonColumnCountChange={setComparisonCols}\n 2896→ comparisonSquaresPerRow={urlState.comparisonSquaresPerRow}\n 2897→ onComparisonSquaresPerRowChange={setComparisonSquaresPerRow}\n 2898→ />\n 2899→ ) : selectedConversation.status === \"pending\" ? (\n 2900→ <Card className=\"p-12 text-center\">\n 2901→ <Clock className=\"h-12 w-12 mx-auto mb-4 text-muted-foreground\" />\n 2902→ <h2 className=\"text-xl font-semibold text-muted-foreground mb-2\">\n 2903→ Waiting to process\n 2904→ </h2>\n 2905→ <p className=\"text-sm text-muted-foreground\">\n 2906→ {selectedConversation.filename} will be processed soon\n 2907→ </p>\n 2908→ </Card>\n 2909→ ) : selectedConversation.status === \"processing\" ? (\n 2910→ <Card className=\"p-12 text-center\">\n 2911→ <Loader2 className=\"h-12 w-12 mx-auto mb-4 text-blue-600 animate-spin\" />\n 2912→ <h2 className=\"text-xl font-semibold text-muted-foreground mb-2\">\n 2913→ Processing...\n 2914→ </h2>\n 2915→ <p className=\"text-sm text-muted-foreground\">\n 2916→ {selectedConversation.filename}\n 2917→ </p>\n 2918→ </Card>\n 2919→ ) : selectedConversation.status === \"failed\" ? (\n 2920→ <Card className=\"p-12 text-center border-red-200 bg-red-50\">\n 2921→ <AlertCircle className=\"h-12 w-12 mx-auto mb-4 text-red-600\" />\n 2922→ <h2 className=\"text-xl font-semibold text-red-900 mb-2\">\n 2923→ Failed to parse\n 2924→ </h2>\n 2925→ <p className=\"text-sm text-red-800 mb-4\">\n 2926→ {selectedConversation.filename}\n 2927→ </p>\n 2928→ <p className=\"text-sm text-red-700 font-mono bg-red-100 p-4 rounded\">\n 2929→ {selectedConversation.error || \"Unknown error\"}\n 2930→ </p>\n 2931→ </Card>\n 2932→ ) : null\n 2933→ ) : (\n 2934→ <Card className=\"p-12 text-center\">\n 2935→ <h2 className=\"text-xl font-semibold text-muted-foreground mb-2\">\n 2936→ No conversation selected\n 2937→ </h2>\n 2938→ <p className=\"text-sm text-muted-foreground\">\n 2939→ Upload files to see their parsed conversations\n 2940→ </p>\n 2941→ </Card>\n 2942→ )}\n 2943→ </main>\n 2944→\n 2945→ {/* Right Sidebar: AI Summary & Analysis */}\n 2946→ <aside>\n 2947→ {selectedConversation ? (\n 2948→ <AISummary\n 2949→ summary={selectedConversation.aiSummary}\n 2950→ analysis={selectedConversation.analysis}\n 2951→ isSummaryStreaming={\n 2952→ selectedConversation.status === \"processing\" &&\n 2953→ selectedConversation.step === \"summary\"\n 2954→ }\n 2955→ isAnalysisStreaming={\n 2956→ selectedConversation.status === \"processing\" &&\n 2957→ selectedConversation.step === \"analysis\"\n 2958→ }\n 2959→ activeTab={insightsTab}\n 2960→ onTabChange={(tab) => setInsightsTab(tab as InsightsTab)}\n 2961→ isCollapsed={isInsightsPanelCollapsed}\n 2962→ onToggleCollapse={handleToggleInsightsPanel}\n 2963→ metadata={selectedConversation.metadata}\n 2964→ conversation={selectedConversation.conversation}\n 2965→ onGenerateSummary={() =>\n 2966→ handleGenerateSummary(selectedConversation.id)\n 2967→ }\n 2968→ canGenerateSummary={\n 2969→ selectedConversation.status === \"success\" &&\n 2970→ !!selectedConversation.conversation &&\n 2971→ !selectedConversation.aiSummary\n 2972→ }\n 2973→ onGenerateAnalysis={() =>\n 2974→ handleGenerateAnalysis(selectedConversation.id)\n 2975→ }\n 2976→ canGenerateAnalysis={\n 2977→ selectedConversation.status === \"success\" &&\n 2978→ !!selectedConversation.components?.length &&\n 2979→ !selectedConversation.analysis\n 2980→ }\n 2981→ />\n 2982→ ) : (\n 2983→ <AISummary\n 2984→ isCollapsed={isInsightsPanelCollapsed}\n 2985→ onToggleCollapse={handleToggleInsightsPanel}\n 2986→ />\n 2987→ )}\n 2988→ </aside>\n 2989→ </div>\n 2990→ )}\n 2991→ </div>\n 2992→\n 2993→ {/* Prompt Editor Dialogs */}\n 2994→ <PromptEditorDialog\n 2995→ open={isPromptDialogOpen}\n 2996→ onOpenChange={setIsPromptDialogOpen}\n 2997→ title=\"Edit Component Identification Prompt\"\n 2998→ description=\"Customize the prompt used to identify components in the conversation. The AI will use this prompt to analyze the conversation and identify logical components.\"\n 2999→ value={editingPrompt}"
}
]
},
{
"id": "103",
"role": "tool",
"timestamp": "2026-03-09T18:30:04.617Z",
"parts": [
{
"id": "104",
"type": "tool-result",
"token_count": 41,
"component": "understanding_codebase",
"toolCallId": "toolu_01XgH9oHCooHE1BcqXKW84Q8",
"toolName": "Grep",
"output": "2859: componentMapping={selectedConversation.componentMapping}\n2860: componentTimeline={selectedConversation.componentTimeline}\n2861: componentColors={selectedConversation.componentColors}"
}
]
},
{
"id": "106",
"role": "assistant",
"timestamp": "2026-03-09T18:30:07.696Z",
"parts": [
{
"id": "105",
"type": "tool-call",
"token_count": 31,
"component": "understanding_codebase",
"toolCallId": "toolu_01QXhpCZmoLtPXpEMZsbbJox",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 80,
"offset": 2993
}
}
]
},
{
"id": "107",
"role": "tool",
"timestamp": "2026-03-09T18:30:07.728Z",
"parts": [
{
"id": "108",
"type": "tool-result",
"token_count": 1209,
"component": "understanding_codebase",
"toolCallId": "toolu_01QXhpCZmoLtPXpEMZsbbJox",
"toolName": "Read",
"output": " 2993→ {/* Prompt Editor Dialogs */}\n 2994→ <PromptEditorDialog\n 2995→ open={isPromptDialogOpen}\n 2996→ onOpenChange={setIsPromptDialogOpen}\n 2997→ title=\"Edit Component Identification Prompt\"\n 2998→ description=\"Customize the prompt used to identify components in the conversation. The AI will use this prompt to analyze the conversation and identify logical components.\"\n 2999→ value={editingPrompt}\n 3000→ onChange={setEditingPrompt}\n 3001→ onApply={handleApplyPrompt}\n 3002→ placeholder=\"Enter your componentisation prompt...\"\n 3003→ warningText=\"This will re-run componentisation, visualization, and analysis\"\n 3004→ />\n 3005→\n 3006→ <PromptEditorDialog\n 3007→ open={isComponentsDialogOpen}\n 3008→ onOpenChange={setIsComponentsDialogOpen}\n 3009→ title=\"Edit Components\"\n 3010→ description=\"Edit the list of components used for mapping. One component per line. These components will be used instead of AI-identified components.\"\n 3011→ value={editingComponents}\n 3012→ onChange={setEditingComponents}\n 3013→ onApply={handleApplyComponents}\n 3014→ placeholder=\"Enter components (one per line)...\"\n 3015→ warningText=\"This will re-run component mapping, visualization, and analysis (skipping component identification)\"\n 3016→ />\n 3017→\n 3018→ <PromptEditorDialog\n 3019→ open={isSegmentationPromptDialogOpen}\n 3020→ onOpenChange={setIsSegmentationPromptDialogOpen}\n 3021→ title=\"Edit Segmentation Prompt\"\n 3022→ description=\"Customize the prompt used to segment large text parts into smaller semantic chunks. The AI will use this prompt to identify where to split long content.\"\n 3023→ value={editingSegmentationPrompt}\n 3024→ onChange={setEditingSegmentationPrompt}\n 3025→ onApply={handleApplySegmentationPrompt}\n 3026→ placeholder=\"Enter your segmentation prompt...\"\n 3027→ warningText=\"This will re-run segmentation, componentisation, visualization, and analysis\"\n 3028→ threshold={editingSegmentationThreshold}\n 3029→ onThresholdChange={setEditingSegmentationThreshold}\n 3030→ thresholdDefault={DEFAULT_SEGMENTATION_THRESHOLD}\n 3031→ />\n 3032→\n 3033→ <PromptEditorDialog\n 3034→ open={isSummaryPromptDialogOpen}\n 3035→ onOpenChange={setIsSummaryPromptDialogOpen}\n 3036→ title=\"Edit Summary Prompt\"\n 3037→ description=\"Customize the prompt used to generate the AI summary. The summary feeds into context analysis.\"\n 3038→ value={editingSummaryPrompt}\n 3039→ onChange={setEditingSummaryPrompt}\n 3040→ onApply={handleApplySummaryPrompt}\n 3041→ placeholder=\"Enter your summary prompt...\"\n 3042→ warningText=\"This will re-run the AI summary and any dependent analysis\"\n 3043→ />\n 3044→\n 3045→ <PromptEditorDialog\n 3046→ open={isAnalysisPromptDialogOpen}\n 3047→ onOpenChange={setIsAnalysisPromptDialogOpen}\n 3048→ title=\"Edit Analysis Prompt\"\n 3049→ description=\"Customize the prompt used to generate context analysis. The analysis identifies patterns, redundancy, and optimization opportunities.\"\n 3050→ value={editingAnalysisPrompt}\n 3051→ onChange={setEditingAnalysisPrompt}\n 3052→ onApply={handleApplyAnalysisPrompt}\n 3053→ placeholder=\"Enter your analysis prompt...\"\n 3054→ warningText=\"This will re-run the context analysis\"\n 3055→ />\n 3056→\n 3057→ <PromptEditorDialog\n 3058→ open={isColoringPromptDialogOpen}\n 3059→ onOpenChange={setIsColoringPromptDialogOpen}\n 3060→ title=\"Edit Coloring Prompt\"\n 3061→ description=\"Customize the prompt used to assign colors to components. Similar components should get the same color for visual grouping.\"\n 3062→ value={editingColoringPrompt}\n 3063→ onChange={setEditingColoringPrompt}\n 3064→ onApply={handleApplyColoringPrompt}\n 3065→ placeholder=\"Enter your coloring prompt...\"\n 3066→ warningText=\"This will re-run color assignment for components\"\n 3067→ />\n 3068→ </div>\n 3069→ );\n 3070→}\n 3071→"
}
]
},
{
"id": "112",
"role": "assistant",
"timestamp": "2026-03-09T18:30:10.475Z",
"parts": [
{
"id": "109",
"type": "text",
"token_count": 28,
"component": "understanding_codebase",
"text": "Now let me look at the ConversationView to understand how it passes props down, and the ConversationList sidebar to see the prompt editing buttons."
},
{
"id": "110",
"type": "tool-call",
"token_count": 29,
"component": "understanding_codebase",
"toolCallId": "toolu_01Qw4ZcUPM4MsESsZ51qF3SZ",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"limit": 100
}
},
{
"id": "111",
"type": "tool-call",
"token_count": 60,
"component": "understanding_codebase",
"toolCallId": "toolu_01GnP262DLYX7hPnJbyvqkLK",
"toolName": "Grep",
"input": {
"pattern": "onEditPrompt|onEditComponents|onEditSegmentation|onEditColoring",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationList.tsx",
"output_mode": "content",
"-n": true,
"head_limit": 30
}
}
]
},
{
"id": "113",
"role": "tool",
"timestamp": "2026-03-09T18:30:11.950Z",
"parts": [
{
"id": "114",
"type": "tool-result",
"token_count": 1563,
"component": "understanding_codebase",
"toolCallId": "toolu_01Qw4ZcUPM4MsESsZ51qF3SZ",
"toolName": "Read",
"output": " 1→import { useState, useMemo, useEffect, useCallback } from \"react\";\n 2→import { ScrollArea } from \"@/components/ui/scroll-area\";\n 3→import { Button } from \"@/components/ui/button\";\n 4→import { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n 5→import { Input } from \"@/components/ui/input\";\n 6→import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\n 7→import { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\";\n 8→import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@/components/ui/tooltip\";\n 9→import { Checkbox } from \"@/components/ui/checkbox\";\n 10→import { Separator } from \"@/components/ui/separator\";\n 11→import { Maximize2, Minimize2, AlertTriangle, X, Search, ArrowUpDown, Filter, ArrowUpNarrowWide, ArrowDownNarrowWide, Copy, Check, Loader2 } from \"lucide-react\";\n 12→import { MessageView } from \"./MessageView\";\n 13→import { ComponentsView } from \"./ComponentsView\";\n 14→import { StaticComponentsView } from \"./StaticComponentsView\";\n 15→import { StackedBarChartView } from \"./StackedBarChartView\";\n 16→import { MessagePartView } from \"./MessagePartView\";\n 17→import {\n 18→ ComponentComparisonView,\n 19→ type ConversationComponentData,\n 20→ type ViewMode as ComparisonViewMode,\n 21→ type LegendMode as ComparisonLegendMode,\n 22→ type SortField as ComparisonSortField,\n 23→ type SortDirection as ComparisonSortDirection,\n 24→} from \"./ComponentComparisonView\";\n 25→import { Card } from \"@/components/ui/card\";\n 26→import { Badge } from \"@/components/ui/badge\";\n 27→import { getStaticComponentLabel } from \"@/lib/static-component-colors\";\n 28→import type { Conversation, Message, SourceInfo } from \"@/schema\";\n 29→import type { ComponentTimelineSnapshot } from \"@/componentisation\";\n 30→import {\n 31→ type MessageFilter,\n 32→ type SortOption as UrlSortOption,\n 33→ type ConversationTab,\n 34→ type GroupTab,\n 35→ ALL_MESSAGE_FILTERS,\n 36→} from \"@/lib/url-state\";\n 37→\n 38→// Re-export types for URL state integration\n 39→export type TabType = ConversationTab | GroupTab;\n 40→export type SortOption = UrlSortOption;\n 41→export type { MessageFilter };\n 42→export { ALL_MESSAGE_FILTERS };\n 43→\n 44→// Internal message filters that include \"all\" pseudo-filter for display purposes\n 45→type MessageFilterWithAll = MessageFilter | \"all\";\n 46→\n 47→// Minimal workflow state info needed for computing source conversation components\n 48→interface SourceWorkflowState {\n 49→ id: string;\n 50→ filename: string;\n 51→ title?: string;\n 52→ conversation?: Conversation;\n 53→ componentMapping?: Record<string, string>;\n 54→}\n 55→\n 56→interface ConversationViewProps {\n 57→ conversation: Conversation;\n 58→ componentMapping?: Record<string, string>;\n 59→ componentTimeline?: ComponentTimelineSnapshot[];\n 60→ componentColors?: Record<string, string>;\n 61→ components?: string[];\n 62→ // Static componentisation (deterministic, no AI)\n 63→ staticMapping?: Record<string, string>;\n 64→ staticTimeline?: ComponentTimelineSnapshot[];\n 65→ warnings?: string[];\n 66→ onReprocessComponents?: (options?: { customPrompt?: string; customComponents?: string[] }) => Promise<void>;\n 67→ isReprocessing?: boolean;\n 68→ // Grouped conversation data\n 69→ messageSourceMap?: Record<string, SourceInfo>;\n 70→ isGrouped?: boolean;\n 71→ groupTitle?: string;\n 72→ onConversationClick?: (id: string) => void;\n 73→ sourceConversationComponents?: ConversationComponentData[];\n 74→ // Source workflow states for grouped conversations (for filtered comparison)\n 75→ sourceWorkflowStates?: SourceWorkflowState[];\n 76→\n 77→ // URL-controlled state (optional - falls back to local state if not provided)\n 78→ activeTab?: TabType;\n 79→ onTabChange?: (tab: TabType) => void;\n 80→ searchQuery?: string;\n 81→ onSearchQueryChange?: (query: string) => void;\n 82→ sortBy?: SortOption;\n 83→ onSortByChange?: (sort: SortOption) => void;\n 84→ messageFilters?: Set<MessageFilter>;\n 85→ onMessageFiltersChange?: (filters: Set<MessageFilter>) => void;\n 86→ selectedComponents?: Set<string>;\n 87→ onSelectedComponentsChange?: (components: Set<string>) => void;\n 88→\n 89→ // Comparison tab controlled state\n 90→ comparisonViewMode?: ComparisonViewMode;\n 91→ onComparisonViewModeChange?: (mode: ComparisonViewMode) => void;\n 92→ comparisonLegendMode?: ComparisonLegendMode;\n 93→ onComparisonLegendModeChange?: (mode: ComparisonLegendMode) => void;\n 94→ comparisonSortField?: ComparisonSortField;\n 95→ onComparisonSortFieldChange?: (field: ComparisonSortField) => void;\n 96→ comparisonSortDirection?: ComparisonSortDirection;\n 97→ onComparisonSortDirectionChange?: (dir: ComparisonSortDirection) => void;\n 98→ comparisonColumnCount?: number;\n 99→ onComparisonColumnCountChange?: (cols: number) => void;\n 100→ comparisonSquaresPerRow?: number;"
}
]
},
{
"id": "115",
"role": "tool",
"timestamp": "2026-03-09T18:30:13.202Z",
"parts": [
{
"id": "116",
"type": "tool-result",
"token_count": 291,
"component": "understanding_codebase",
"toolCallId": "toolu_01GnP262DLYX7hPnJbyvqkLK",
"toolName": "Grep",
"output": "85: onEditPrompt?: (id: string) => void;\n86: onEditComponents?: (id: string) => void;\n87: onEditSegmentationPrompt?: (id: string) => void;\n90: onEditColoringPrompt?: (id: string) => void;\n117: onEditPrompt,\n118: onEditComponents,\n119: onEditSegmentationPrompt,\n122: onEditColoringPrompt,\n766: onEditSegmentationPrompt && (\n771: onEditSegmentationPrompt(conversation.id);\n795: (onEditPrompt || onEditComponents) && (\n797: {onEditPrompt && (\n801: onEditPrompt(conversation.id);\n808: {onEditComponents && (\n812: onEditComponents(conversation.id);\n822: {isColoringStep && onEditColoringPrompt && (\n827: onEditColoringPrompt(conversation.id);\n963: onEditPrompt={onEditPrompt}\n964: onEditComponents={onEditComponents}\n965: onEditSegmentationPrompt={onEditSegmentationPrompt}\n968: onEditColoringPrompt={onEditColoringPrompt}\n\n[Showing results with pagination = limit: 30, offset: 0]"
}
]
},
{
"id": "120",
"role": "assistant",
"timestamp": "2026-03-09T18:30:16.602Z",
"parts": [
{
"id": "117",
"type": "text",
"token_count": 46,
"component": "task_management",
"text": "This is a substantial feature with many files to change. Let me take a phased approach. I'll start with the core data model changes and work outward.\n\nLet me first understand the full scope of files that reference the old component fields."
},
{
"id": "118",
"type": "tool-call",
"token_count": 42,
"component": "understanding_codebase",
"toolCallId": "toolu_016tuNviU64jqC1ardJHD6Fm",
"toolName": "Grep",
"input": {
"pattern": "componentMapping|componentTimeline|componentColors",
"glob": "*.ts",
"path": "/Users/srihari/work/nilenso/context-viewer/src",
"output_mode": "files_with_matches"
}
},
{
"id": "119",
"type": "tool-call",
"token_count": 42,
"component": "understanding_codebase",
"toolCallId": "toolu_01BRRej2YpC7U9fbXXTM8x2o",
"toolName": "Grep",
"input": {
"pattern": "componentMapping|componentTimeline|componentColors",
"glob": "*.tsx",
"path": "/Users/srihari/work/nilenso/context-viewer/src",
"output_mode": "files_with_matches"
}
}
]
},
{
"id": "121",
"role": "tool",
"timestamp": "2026-03-09T18:30:18.616Z",
"parts": [
{
"id": "122",
"type": "tool-result",
"token_count": 45,
"component": "understanding_codebase",
"toolCallId": "toolu_016tuNviU64jqC1ardJHD6Fm",
"toolName": "Grep",
"output": "Found 6 files\nsrc/componentisation.ts\nsrc/lib/export-builder.ts\nsrc/parsers/context-viewer-parser.ts\nsrc/parser.ts\nsrc/lib/component-colors.ts\nsrc/ai-summary.ts"
}
]
},
{
"id": "123",
"role": "tool",
"timestamp": "2026-03-09T18:30:19.409Z",
"parts": [
{
"id": "124",
"type": "tool-result",
"token_count": 66,
"component": "understanding_codebase",
"toolCallId": "toolu_01BRRej2YpC7U9fbXXTM8x2o",
"toolName": "Grep",
"output": "Found 7 files\nsrc/App.tsx\nsrc/components/ConversationView.tsx\nsrc/components/ComponentComparisonView.tsx\nsrc/components/ComponentsView.tsx\nsrc/components/MessageView.tsx\nsrc/components/MessagePartView.tsx\nsrc/components/StackedBarChartView.tsx"
}
]
},
{
"id": "128",
"role": "assistant",
"timestamp": "2026-03-09T18:30:25.277Z",
"parts": [
{
"id": "125",
"type": "reasoning",
"token_count": 138,
"component": "feature_design",
"text": "This is a very large feature with ~13 files to modify. Let me take a strategic approach:\n\n1. First add the `DimensionData` type to `componentisation.ts`\n2. Add `dimensions` field to `WorkflowState` in `App.tsx`\n3. Add migration/accessor helpers\n4. Update the pipeline to work per-dimension\n5. Add color blending\n6. Update the UI components\n\nGiven the scope, let me start implementing step by step. I'll work from the bottom up (data model → pipeline → UI).\n\nLet me start with the DimensionData type and color blending utilities, then update WorkflowState and the pipeline, and finally the UI."
},
{
"id": "126",
"type": "text",
"token_count": 42,
"component": "task_management",
"text": "This is a large feature touching ~13 files. I'll implement it in stages. Let me start with the foundational data model and work outward.\n\n### Step 1: Add `DimensionData` type and color blending"
},
{
"id": "127",
"type": "tool-call",
"token_count": 206,
"component": "workflow_refactor",
"toolCallId": "toolu_01CRb213oQt2S9S8B53MMx8i",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/componentisation.ts",
"old_string": "/**\n * Timeline snapshot representing component composition at a specific message\n */\nexport interface ComponentTimelineSnapshot {",
"new_string": "/**\n * Represents one dimension of componentisation.\n * Each dimension has its own prompt, components, mapping, colors, and timeline.\n */\nexport interface DimensionData {\n name: string;\n prompt?: string; // custom identification prompt\n components: string[];\n componentMapping: Record<string, string>; // partId → componentName\n componentTimeline: ComponentTimelineSnapshot[];\n componentColors: Record<string, string>; // componentName → color\n customComponents?: string[];\n customColoringPrompt?: string;\n}\n\n/**\n * Timeline snapshot representing component composition at a specific message\n */\nexport interface ComponentTimelineSnapshot {"
}
}
]
},
{
"id": "129",
"role": "tool",
"timestamp": "2026-03-09T18:31:00.351Z",
"parts": [
{
"id": "130",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01CRb213oQt2S9S8B53MMx8i",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/componentisation.ts has been updated successfully."
}
]
},
{
"id": "133",
"role": "assistant",
"timestamp": "2026-03-09T18:31:02.717Z",
"parts": [
{
"id": "131",
"type": "text",
"token_count": 9,
"component": "workflow_refactor",
"text": "Now add color blending to the color utilities:"
},
{
"id": "132",
"type": "tool-call",
"token_count": 557,
"component": "workflow_refactor",
"toolCallId": "toolu_01KAJF81gcPMBpipGqyH7PZR",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/lib/component-colors.ts",
"old_string": "/**\n * Get the raw waffle hex for a component (the main saturated color).\n * Used for charts and visualizations where we need the actual hex value.\n */",
"new_string": "/**\n * Blend multiple hex colors by averaging their RGB components.\n * Used when visualising multiple dimensions simultaneously.\n */\nexport function blendColors(hexColors: string[]): string {\n if (hexColors.length === 0) return colorNameToWaffleHex.gray!;\n if (hexColors.length === 1) return hexColors[0]!;\n\n const rgbs = hexColors.map(hexToRgb);\n const avg = {\n r: Math.round(rgbs.reduce((s, c) => s + c.r, 0) / rgbs.length),\n g: Math.round(rgbs.reduce((s, c) => s + c.g, 0) / rgbs.length),\n b: Math.round(rgbs.reduce((s, c) => s + c.b, 0) / rgbs.length),\n };\n return rgbToHex(avg.r, avg.g, avg.b);\n}\n\n/**\n * Get a blended color for a part across multiple active dimensions.\n * Returns a single hex color representing the blend of all active dimension colors.\n */\nexport function getBlendedColorForPart(\n partId: string,\n dimensions: Record<string, { componentMapping: Record<string, string>; componentColors: Record<string, string> }>,\n activeDimensionNames: string[],\n): string {\n const colors = activeDimensionNames\n .map((dim) => {\n const dimData = dimensions[dim];\n if (!dimData) return null;\n const component = dimData.componentMapping[partId];\n if (!component) return null;\n return getComponentWaffleHex(component, dimData.componentColors);\n })\n .filter((c): c is string => c !== null);\n\n if (colors.length === 0) return colorNameToWaffleHex.gray!;\n if (colors.length === 1) return colors[0]!;\n return blendColors(colors);\n}\n\n/**\n * Get the raw waffle hex for a component (the main saturated color).\n * Used for charts and visualizations where we need the actual hex value.\n */"
}
}
]
},
{
"id": "134",
"role": "tool",
"timestamp": "2026-03-09T18:31:10.992Z",
"parts": [
{
"id": "135",
"type": "tool-result",
"token_count": 26,
"component": "workflow_refactor",
"toolCallId": "toolu_01KAJF81gcPMBpipGqyH7PZR",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/lib/component-colors.ts has been updated successfully."
}
]
},
{
"id": "138",
"role": "assistant",
"timestamp": "2026-03-09T18:31:14.674Z",
"parts": [
{
"id": "136",
"type": "text",
"token_count": 11,
"component": "workflow_refactor",
"text": "### Step 2: Update WorkflowState with dimensions field"
},
{
"id": "137",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01VyWg6VdfVGh6zgZNwKeBq1",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 10,
"offset": 1
}
}
]
},
{
"id": "139",
"role": "tool",
"timestamp": "2026-03-09T18:31:15.053Z",
"parts": [
{
"id": "140",
"type": "tool-result",
"token_count": 157,
"component": "understanding_codebase",
"toolCallId": "toolu_01VyWg6VdfVGh6zgZNwKeBq1",
"toolName": "Read",
"output": " 1→import { useEffect, useMemo, useRef, useState, useCallback } from \"react\";\n 2→import { useMutation } from \"@tanstack/react-query\";\n 3→import { useDropzone } from \"react-dropzone\";\n 4→import { parserRegistry, type ConversationMetadata } from \"./parser\";\n 5→import \"./parsers\";\n 6→import type { Conversation, SourceInfo, Message } from \"./schema\";\n 7→import {\n 8→ summarizeConversation,\n 9→ type ConversationSummary,\n 10→} from \"./conversation-summary\";"
}
]
},
{
"id": "142",
"role": "assistant",
"timestamp": "2026-03-09T18:31:18.028Z",
"parts": [
{
"id": "141",
"type": "tool-call",
"token_count": 40,
"component": "understanding_codebase",
"toolCallId": "toolu_01Vgz1vbooXaC1geV7QJdKZe",
"toolName": "Grep",
"input": {
"pattern": "^import.*componentisation",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "143",
"role": "tool",
"timestamp": "2026-03-09T18:31:18.066Z",
"parts": [
{
"id": "144",
"type": "tool-result",
"token_count": 19,
"component": "understanding_codebase",
"toolCallId": "toolu_01Vgz1vbooXaC1geV7QJdKZe",
"toolName": "Grep",
"output": "20:import { staticComponentise } from \"./static-componentisation\";"
}
]
},
{
"id": "146",
"role": "assistant",
"timestamp": "2026-03-09T18:31:21.554Z",
"parts": [
{
"id": "145",
"type": "tool-call",
"token_count": 40,
"component": "understanding_codebase",
"toolCallId": "toolu_01LQ8xquQGjUBW68w9226BFL",
"toolName": "Grep",
"input": {
"pattern": "^import.*componentis",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "147",
"role": "tool",
"timestamp": "2026-03-09T18:31:21.578Z",
"parts": [
{
"id": "148",
"type": "tool-result",
"token_count": 19,
"component": "understanding_codebase",
"toolCallId": "toolu_01LQ8xquQGjUBW68w9226BFL",
"toolName": "Grep",
"output": "20:import { staticComponentise } from \"./static-componentisation\";"
}
]
},
{
"id": "150",
"role": "assistant",
"timestamp": "2026-03-09T18:31:24.210Z",
"parts": [
{
"id": "149",
"type": "tool-call",
"token_count": 39,
"component": "understanding_codebase",
"toolCallId": "toolu_013HZZieFBGsuxu1jR3XX8oJ",
"toolName": "Grep",
"input": {
"pattern": "from.*componentisation",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "151",
"role": "tool",
"timestamp": "2026-03-09T18:31:24.236Z",
"parts": [
{
"id": "152",
"type": "tool-result",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_013HZZieFBGsuxu1jR3XX8oJ",
"toolName": "Grep",
"output": "19:} from \"./componentisation\";\n20:import { staticComponentise } from \"./static-componentisation\";"
}
]
},
{
"id": "154",
"role": "assistant",
"timestamp": "2026-03-09T18:31:26.503Z",
"parts": [
{
"id": "153",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_017ZwWS7xiPnTtNijKLTsLU2",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 10,
"offset": 11
}
}
]
},
{
"id": "155",
"role": "tool",
"timestamp": "2026-03-09T18:31:26.540Z",
"parts": [
{
"id": "156",
"type": "tool-result",
"token_count": 135,
"component": "understanding_codebase",
"toolCallId": "toolu_017ZwWS7xiPnTtNijKLTsLU2",
"toolName": "Read",
"output": " 11→import { addTokenCounts } from \"./add-token-counts\";\n 12→import { segmentConversation, DEFAULT_SEGMENTATION_THRESHOLD } from \"./segmentation\";\n 13→import {\n 14→ componentiseConversation,\n 15→ assignComponentColors,\n 16→ getComponentisationConfig,\n 17→ buildComponentTimeline,\n 18→ type ComponentTimelineSnapshot,\n 19→} from \"./componentisation\";\n 20→import { staticComponentise } from \"./static-componentisation\";"
}
]
},
{
"id": "159",
"role": "assistant",
"timestamp": "2026-03-09T18:31:29.733Z",
"parts": [
{
"id": "157",
"type": "text",
"token_count": 14,
"component": "workflow_refactor",
"text": "Now update the import to include DimensionData, and update WorkflowState:"
},
{
"id": "158",
"type": "tool-call",
"token_count": 127,
"component": "workflow_refactor",
"toolCallId": "toolu_01FerTs3PDK7zkebdA1yxCew",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": "import {\n componentiseConversation,\n assignComponentColors,\n getComponentisationConfig,\n buildComponentTimeline,\n type ComponentTimelineSnapshot,\n} from \"./componentisation\";",
"new_string": "import {\n componentiseConversation,\n assignComponentColors,\n getComponentisationConfig,\n buildComponentTimeline,\n type ComponentTimelineSnapshot,\n type DimensionData,\n} from \"./componentisation\";"
}
}
]
},
{
"id": "160",
"role": "tool",
"timestamp": "2026-03-09T18:31:31.697Z",
"parts": [
{
"id": "161",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01FerTs3PDK7zkebdA1yxCew",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "164",
"role": "assistant",
"timestamp": "2026-03-09T18:31:34.429Z",
"parts": [
{
"id": "162",
"type": "text",
"token_count": 16,
"component": "workflow_refactor",
"text": "Now add `dimensions` to WorkflowState and a `targetDimension` field:"
},
{
"id": "163",
"type": "tool-call",
"token_count": 191,
"component": "workflow_refactor",
"toolCallId": "toolu_01S2ZBirAz1uFuQnKhqY4ihm",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " // Component data (automatic - AI-based)\n components?: string[];\n componentMapping?: Record<string, string>;\n componentTimeline?: ComponentTimelineSnapshot[];\n componentColors?: Record<string, string>;",
"new_string": " // Component data (automatic - AI-based)\n // Legacy single-dimension fields (still used as primary accessors, mapped from dimensions[\"default\"])\n components?: string[];\n componentMapping?: Record<string, string>;\n componentTimeline?: ComponentTimelineSnapshot[];\n componentColors?: Record<string, string>;\n\n // Multi-dimensional component data\n dimensions?: Record<string, DimensionData>;\n targetDimension?: string; // When set, only reprocess this dimension"
}
}
]
},
{
"id": "165",
"role": "tool",
"timestamp": "2026-03-09T18:31:38.855Z",
"parts": [
{
"id": "166",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01S2ZBirAz1uFuQnKhqY4ihm",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "169",
"role": "assistant",
"timestamp": "2026-03-09T18:31:42.716Z",
"parts": [
{
"id": "167",
"type": "text",
"token_count": 49,
"component": "workflow_refactor",
"text": "### Step 3: Add dimension helpers and update the pipeline\n\nNow I need to add helper functions to sync dimensions <-> legacy fields, and update the pipeline. Let me add the helpers after the WorkflowRunner class and before the workflow function."
},
{
"id": "168",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01CAi5rsukFAcLaRxnD3axn6",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 30,
"offset": 555
}
}
]
},
{
"id": "170",
"role": "tool",
"timestamp": "2026-03-09T18:31:43.320Z",
"parts": [
{
"id": "171",
"type": "tool-result",
"token_count": 343,
"component": "workflow_refactor",
"toolCallId": "toolu_01CAi5rsukFAcLaRxnD3axn6",
"toolName": "Read",
"output": " 555→ warnings: ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 556→ stepTimings: ctx.stepTimings,\n 557→ status: \"paused-for-api-key\",\n 558→ step: undefined,\n 559→ pausedAtStep: nextStep,\n 560→ });\n 561→ }\n 562→}\n 563→\n 564→// ============================================================================\n 565→// Main Workflow\n 566→// ============================================================================\n 567→\n 568→/**\n 569→ * Process conversation workflow: Single linear workflow with conditional step skipping\n 570→ */\n 571→async function processConversationWorkflow(\n 572→ event: WorkflowEvent,\n 573→ ctx: WorkflowState,\n 574→ runner: WorkflowRunner,\n 575→ callbacks: WorkflowCallbacks,\n 576→): Promise<void> {\n 577→ try {\n 578→ if (event === WorkflowEvent.SummaryPromptChanged) {\n 579→ ctx.aiSummary = \"\";\n 580→ runner.startStep(ctx, \"summary\");\n 581→ const { result: summaryResult, timing: summaryTiming } =\n 582→ await runner.runActivity(\n 583→ ctx,\n 584→ createSummaryActivity(callbacks.onSummaryChunk),"
}
]
},
{
"id": "174",
"role": "assistant",
"timestamp": "2026-03-09T18:31:46.422Z",
"parts": [
{
"id": "172",
"type": "text",
"token_count": 9,
"component": "workflow_refactor",
"text": "Add helpers right before the main workflow section:"
},
{
"id": "173",
"type": "tool-call",
"token_count": 469,
"component": "workflow_refactor",
"toolCallId": "toolu_011dRwcE1KDKwZ3UxUWgTdFq",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": "// ============================================================================\n// Main Workflow\n// ============================================================================",
"new_string": "// ============================================================================\n// Dimension Helpers\n// ============================================================================\n\n/**\n * Sync legacy single-dimension fields from the \"default\" dimension in ctx.dimensions.\n * Call this after updating dimensions to keep backward-compatible fields in sync.\n */\nfunction syncLegacyFieldsFromDimensions(ctx: WorkflowState): void {\n const defaultDim = ctx.dimensions?.[\"default\"];\n if (defaultDim) {\n ctx.components = defaultDim.components;\n ctx.componentMapping = defaultDim.componentMapping;\n ctx.componentTimeline = defaultDim.componentTimeline;\n ctx.componentColors = defaultDim.componentColors;\n }\n}\n\n/**\n * Ensure ctx.dimensions exists and has at least a \"default\" entry.\n * If legacy fields exist but dimensions don't, migrate them.\n */\nfunction ensureDimensions(ctx: WorkflowState): Record<string, DimensionData> {\n if (!ctx.dimensions) {\n ctx.dimensions = {};\n }\n // If we have legacy fields but no default dimension, migrate\n if (!ctx.dimensions[\"default\"] && ctx.components) {\n ctx.dimensions[\"default\"] = {\n name: \"default\",\n prompt: ctx.customPrompt,\n components: ctx.components || [],\n componentMapping: ctx.componentMapping || {},\n componentTimeline: ctx.componentTimeline || [],\n componentColors: ctx.componentColors || {},\n };\n }\n return ctx.dimensions;\n}\n\n/**\n * Get dimension names from a WorkflowState, defaulting to [\"default\"].\n */\nfunction getDimensionNames(ctx: WorkflowState): string[] {\n if (!ctx.dimensions || Object.keys(ctx.dimensions).length === 0) {\n return [\"default\"];\n }\n return Object.keys(ctx.dimensions);\n}\n\n// ============================================================================\n// Main Workflow\n// ============================================================================"
}
}
]
},
{
"id": "175",
"role": "tool",
"timestamp": "2026-03-09T18:31:52.747Z",
"parts": [
{
"id": "176",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_011dRwcE1KDKwZ3UxUWgTdFq",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "179",
"role": "assistant",
"timestamp": "2026-03-09T18:31:57.654Z",
"parts": [
{
"id": "177",
"type": "text",
"token_count": 47,
"component": "workflow_refactor",
"text": "### Step 4: Update the findComponentsActivity and assignColorsActivity to work with dimensions\n\nNow I need to update the `findComponentsActivity` to populate dimensions. Let me also update the workflow to handle per-dimension processing."
},
{
"id": "178",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_016BiWMbjK94Tr5UVKH3BTK2",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 50,
"offset": 257
}
}
]
},
{
"id": "180",
"role": "tool",
"timestamp": "2026-03-09T18:31:58.308Z",
"parts": [
{
"id": "181",
"type": "tool-result",
"token_count": 508,
"component": "workflow_refactor",
"toolCallId": "toolu_016BiWMbjK94Tr5UVKH3BTK2",
"toolName": "Read",
"output": " 257→ };\n 258→};\n 259→\n 260→/**\n 261→ * Component identification activity: Identify components in conversation\n 262→ */\n 263→const findComponentsActivity: Activity<{\n 264→ components: string[];\n 265→ mapping: Record<string, string>;\n 266→ timeline: ComponentTimelineSnapshot[];\n 267→ error?: string;\n 268→}> = async (ctx) => {\n 269→ const result = await componentiseConversation(\n 270→ ctx.conversation!,\n 271→ undefined,\n 272→ ctx.customPrompt,\n 273→ ctx.customComponents,\n 274→ ctx.id, // Pass conversationId for logging\n 275→ );\n 276→\n 277→ return {\n 278→ components: result.components,\n 279→ mapping: result.mapping,\n 280→ timeline: result.timeline,\n 281→ error: result.error,\n 282→ };\n 283→};\n 284→\n 285→/**\n 286→ * Color assignment activity: Assign colors to components\n 287→ */\n 288→const assignColorsActivity: Activity<{\n 289→ colors: Record<string, string>;\n 290→}> = async (ctx) => {\n 291→ if (!ctx.config || !ctx.components?.length) {\n 292→ return { colors: {} };\n 293→ }\n 294→\n 295→ const colors = await assignComponentColors(\n 296→ ctx.components,\n 297→ ctx.config,\n 298→ ctx.id,\n 299→ ctx.presetColors,\n 300→ ctx.customColoringPrompt,\n 301→ );\n 302→ return { colors };\n 303→};\n 304→\n 305→/**\n 306→ * Calculate conversation stats for the summary prompt"
}
]
},
{
"id": "184",
"role": "assistant",
"timestamp": "2026-03-09T18:32:02.732Z",
"parts": [
{
"id": "182",
"type": "text",
"token_count": 73,
"component": "feature_design",
"text": "I need to update `findComponentsActivity` and `assignColorsActivity` to be dimension-aware. But I need to be careful about backward compatibility - the existing workflow code uses these activities and writes to the legacy fields.\n\nThe approach: I'll create new per-dimension activities and update the workflow to use them. The legacy fields will be synced from the default dimension."
},
{
"id": "183",
"type": "tool-call",
"token_count": 1079,
"component": "workflow_refactor",
"toolCallId": "toolu_01Rn7oNeaXq4g7AMSc3RTkeh",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": "/**\n * Component identification activity: Identify components in conversation\n */\nconst findComponentsActivity: Activity<{\n components: string[];\n mapping: Record<string, string>;\n timeline: ComponentTimelineSnapshot[];\n error?: string;\n}> = async (ctx) => {\n const result = await componentiseConversation(\n ctx.conversation!,\n undefined,\n ctx.customPrompt,\n ctx.customComponents,\n ctx.id, // Pass conversationId for logging\n );\n\n return {\n components: result.components,\n mapping: result.mapping,\n timeline: result.timeline,\n error: result.error,\n };\n};\n\n/**\n * Color assignment activity: Assign colors to components\n */\nconst assignColorsActivity: Activity<{\n colors: Record<string, string>;\n}> = async (ctx) => {\n if (!ctx.config || !ctx.components?.length) {\n return { colors: {} };\n }\n\n const colors = await assignComponentColors(\n ctx.components,\n ctx.config,\n ctx.id,\n ctx.presetColors,\n ctx.customColoringPrompt,\n );\n return { colors };\n};",
"new_string": "/**\n * Component identification activity: Identify components in conversation.\n * Processes all dimensions (or a single targetDimension if set).\n */\nconst findComponentsActivity: Activity<{\n components: string[];\n mapping: Record<string, string>;\n timeline: ComponentTimelineSnapshot[];\n dimensions: Record<string, DimensionData>;\n error?: string;\n}> = async (ctx) => {\n const dims = ensureDimensions(ctx);\n const dimNames = ctx.targetDimension\n ? [ctx.targetDimension]\n : getDimensionNames(ctx).length > 0\n ? getDimensionNames(ctx)\n : [\"default\"];\n\n const errors: string[] = [];\n\n // Process each dimension (in parallel if multiple)\n await Promise.all(\n dimNames.map(async (dimName) => {\n const dimData = dims[dimName];\n const prompt = dimData?.prompt ?? ctx.customPrompt;\n const customComponents = dimData?.customComponents ?? ctx.customComponents;\n\n const result = await componentiseConversation(\n ctx.conversation!,\n undefined,\n prompt,\n customComponents,\n ctx.id,\n );\n\n if (result.error) errors.push(`[${dimName}] ${result.error}`);\n\n dims[dimName] = {\n ...(dims[dimName] || { name: dimName }),\n name: dimName,\n prompt,\n components: result.components,\n componentMapping: result.mapping,\n componentTimeline: result.timeline,\n componentColors: dims[dimName]?.componentColors || {},\n customComponents: customComponents,\n };\n }),\n );\n\n // Return default dimension's data as legacy fields\n const defaultDim = dims[\"default\"];\n return {\n components: defaultDim?.components || [],\n mapping: defaultDim?.componentMapping || {},\n timeline: defaultDim?.componentTimeline || [],\n dimensions: dims,\n error: errors.length > 0 ? errors.join(\"; \") : undefined,\n };\n};\n\n/**\n * Color assignment activity: Assign colors to all dimensions.\n */\nconst assignColorsActivity: Activity<{\n colors: Record<string, string>;\n dimensions: Record<string, DimensionData>;\n}> = async (ctx) => {\n const dims = ensureDimensions(ctx);\n const dimNames = ctx.targetDimension\n ? [ctx.targetDimension]\n : getDimensionNames(ctx);\n\n // Assign colors for each dimension in parallel\n await Promise.all(\n dimNames.map(async (dimName) => {\n const dimData = dims[dimName];\n if (!dimData || !ctx.config || !dimData.components?.length) return;\n\n const colors = await assignComponentColors(\n dimData.components,\n ctx.config,\n ctx.id,\n ctx.presetColors,\n dimData.customColoringPrompt ?? ctx.customColoringPrompt,\n );\n dims[dimName] = { ...dimData, componentColors: colors };\n }),\n );\n\n // Return default dimension's colors as legacy field\n const defaultDim = dims[\"default\"];\n return {\n colors: defaultDim?.componentColors || {},\n dimensions: dims,\n };\n};"
}
}
]
},
{
"id": "185",
"role": "tool",
"timestamp": "2026-03-09T18:32:14.916Z",
"parts": [
{
"id": "186",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01Rn7oNeaXq4g7AMSc3RTkeh",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "189",
"role": "assistant",
"timestamp": "2026-03-09T18:32:19.985Z",
"parts": [
{
"id": "187",
"type": "text",
"token_count": 48,
"component": "workflow_refactor",
"text": "### Step 5: Update the workflow to pass dimensions through state\n\nNow I need to update `processConversationWorkflow` and the `WorkflowRunner` to include `dimensions` in state updates. Let me update the workflow runner methods first."
},
{
"id": "188",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01AAJVYB67aNuUmm6SaJ9mTT",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 15,
"offset": 446
}
}
]
},
{
"id": "190",
"role": "tool",
"timestamp": "2026-03-09T18:32:20.710Z",
"parts": [
{
"id": "191",
"type": "tool-result",
"token_count": 160,
"component": "workflow_refactor",
"toolCallId": "toolu_01AAJVYB67aNuUmm6SaJ9mTT",
"toolName": "Read",
"output": " 446→\n 447→ const result = await generateContextAnalysis(\n 448→ ctx.conversation!,\n 449→ ctx.componentTimeline!,\n 450→ ctx.components,\n 451→ ctx.aiSummary,\n 452→ (chunk) => onChunk?.(ctx.id, chunk),\n 453→ ctx.customAnalysisPrompt,\n 454→ ctx.id, // Pass conversationId for logging\n 455→ );\n 456→\n 457→ return {\n 458→ analysis: result.analysis,\n 459→ error: result.error,\n 460→ };"
}
]
},
{
"id": "194",
"role": "assistant",
"timestamp": "2026-03-09T18:32:24.668Z",
"parts": [
{
"id": "192",
"type": "text",
"token_count": 37,
"component": "workflow_refactor",
"text": "The WorkflowRunner.startStep, updateState, markComplete methods all spread specific fields. I need to add `dimensions` to all of them. Let me find and update those methods."
},
{
"id": "193",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01VN7iMqRQfGCuHo5xjbMuu6",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 120,
"offset": 495
}
}
]
},
{
"id": "195",
"role": "tool",
"timestamp": "2026-03-09T18:32:25.055Z",
"parts": [
{
"id": "196",
"type": "tool-result",
"token_count": 1498,
"component": "workflow_refactor",
"toolCallId": "toolu_01VN7iMqRQfGCuHo5xjbMuu6",
"toolName": "Read",
"output": " 495→\n 496→ /**\n 497→ * Update state to mark a step as starting\n 498→ */\n 499→ startStep(ctx: WorkflowState, step: ProcessingStep) {\n 500→ // Mark step start in the logging system\n 501→ markStepStart(ctx.id, step as ProcessingPhase);\n 502→\n 503→ this.setState(ctx.id, {\n 504→ status: \"processing\",\n 505→ step,\n 506→ conversation: ctx.conversation,\n 507→ summary: ctx.summary,\n 508→ metadata: ctx.metadata,\n 509→ customPrompt: ctx.customPrompt,\n 510→ customSegmentationPrompt: ctx.customSegmentationPrompt,\n 511→ customSummaryPrompt: ctx.customSummaryPrompt,\n 512→ customAnalysisPrompt: ctx.customAnalysisPrompt,\n 513→ customColoringPrompt: ctx.customColoringPrompt,\n 514→ componentMapping: ctx.componentMapping,\n 515→ componentTimeline: ctx.componentTimeline,\n 516→ componentColors: ctx.componentColors,\n 517→ components: ctx.components,\n 518→ staticComponents: ctx.staticComponents,\n 519→ staticMapping: ctx.staticMapping,\n 520→ staticTimeline: ctx.staticTimeline,\n 521→ analysis: ctx.analysis,\n 522→ aiSummary: ctx.aiSummary,\n 523→ warnings:\n 524→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 525→ stepTimings: ctx.stepTimings,\n 526→ });\n 527→ }\n 528→\n 529→ /**\n 530→ * Update state with current context (intermediate update, keeps status as 'success')\n 531→ */\n 532→ updateState(ctx: WorkflowState, nextStep?: ProcessingStep) {\n 533→ this.setState(ctx.id, {\n 534→ conversation: ctx.conversation,\n 535→ summary: ctx.summary,\n 536→ metadata: ctx.metadata,\n 537→ aiSummary: ctx.aiSummary,\n 538→ customPrompt: ctx.customPrompt,\n 539→ customSegmentationPrompt: ctx.customSegmentationPrompt,\n 540→ customSummaryPrompt: ctx.customSummaryPrompt,\n 541→ customAnalysisPrompt: ctx.customAnalysisPrompt,\n 542→ customColoringPrompt: ctx.customColoringPrompt,\n 543→ components: ctx.components,\n 544→ componentMapping: ctx.componentMapping,\n 545→ componentTimeline: ctx.componentTimeline,\n 546→ componentColors: ctx.componentColors,\n 547→ staticComponents: ctx.staticComponents,\n 548→ staticMapping: ctx.staticMapping,\n 549→ staticTimeline: ctx.staticTimeline,\n 550→ analysis: ctx.analysis,\n 551→ warnings:\n 552→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 553→ stepTimings: ctx.stepTimings,\n 554→ status: \"success\",\n 555→ step: nextStep,\n 556→ });\n 557→ }\n 558→\n 559→ /**\n 560→ * Mark workflow as complete\n 561→ */\n 562→ markComplete(ctx: WorkflowState) {\n 563→ this.setState(ctx.id, {\n 564→ conversation: ctx.conversation,\n 565→ summary: ctx.summary,\n 566→ metadata: ctx.metadata,\n 567→ title: ctx.title,\n 568→ aiSummary: ctx.aiSummary,\n 569→ customPrompt: ctx.customPrompt,\n 570→ customSegmentationPrompt: ctx.customSegmentationPrompt,\n 571→ customSummaryPrompt: ctx.customSummaryPrompt,\n 572→ customAnalysisPrompt: ctx.customAnalysisPrompt,\n 573→ customColoringPrompt: ctx.customColoringPrompt,\n 574→ components: ctx.components,\n 575→ componentMapping: ctx.componentMapping,\n 576→ componentTimeline: ctx.componentTimeline,\n 577→ componentColors: ctx.componentColors,\n 578→ staticComponents: ctx.staticComponents,\n 579→ staticMapping: ctx.staticMapping,\n 580→ staticTimeline: ctx.staticTimeline,\n 581→ analysis: ctx.analysis,\n 582→ warnings:\n 583→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 584→ stepTimings: ctx.stepTimings,\n 585→ status: \"success\",\n 586→ step: undefined,\n 587→ });\n 588→ }\n 589→\n 590→ /**\n 591→ * Mark workflow as failed\n 592→ */\n 593→ markFailed(id: string, error: string) {\n 594→ this.setState(id, { status: \"failed\", step: undefined, error });\n 595→ }\n 596→\n 597→ /**\n 598→ * Mark workflow as paused waiting for API key\n 599→ */\n 600→ markPausedForApiKey(ctx: WorkflowState, nextStep: ProcessingStep) {\n 601→ this.setState(ctx.id, {\n 602→ conversation: ctx.conversation,\n 603→ summary: ctx.summary,\n 604→ metadata: ctx.metadata,\n 605→ staticComponents: ctx.staticComponents,\n 606→ staticMapping: ctx.staticMapping,\n 607→ staticTimeline: ctx.staticTimeline,\n 608→ warnings: ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 609→ stepTimings: ctx.stepTimings,\n 610→ status: \"paused-for-api-key\",\n 611→ step: undefined,\n 612→ pausedAtStep: nextStep,\n 613→ });\n 614→ }"
}
]
},
{
"id": "199",
"role": "assistant",
"timestamp": "2026-03-09T18:32:27.691Z",
"parts": [
{
"id": "197",
"type": "text",
"token_count": 20,
"component": "workflow_refactor",
"text": "I need to add `dimensions` to all these setState calls. Let me do them all:"
},
{
"id": "198",
"type": "tool-call",
"token_count": 469,
"component": "workflow_refactor",
"toolCallId": "toolu_01Kqz37EKCKViVxUMAuPU82e",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " this.setState(ctx.id, {\n status: \"processing\",\n step,\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n customPrompt: ctx.customPrompt,\n customSegmentationPrompt: ctx.customSegmentationPrompt,\n customSummaryPrompt: ctx.customSummaryPrompt,\n customAnalysisPrompt: ctx.customAnalysisPrompt,\n customColoringPrompt: ctx.customColoringPrompt,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n components: ctx.components,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n aiSummary: ctx.aiSummary,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n });",
"new_string": " this.setState(ctx.id, {\n status: \"processing\",\n step,\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n customPrompt: ctx.customPrompt,\n customSegmentationPrompt: ctx.customSegmentationPrompt,\n customSummaryPrompt: ctx.customSummaryPrompt,\n customAnalysisPrompt: ctx.customAnalysisPrompt,\n customColoringPrompt: ctx.customColoringPrompt,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n components: ctx.components,\n dimensions: ctx.dimensions,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n aiSummary: ctx.aiSummary,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n });"
}
}
]
},
{
"id": "200",
"role": "tool",
"timestamp": "2026-03-09T18:32:33.637Z",
"parts": [
{
"id": "201",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01Kqz37EKCKViVxUMAuPU82e",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "203",
"role": "assistant",
"timestamp": "2026-03-09T18:32:42.764Z",
"parts": [
{
"id": "202",
"type": "tool-call",
"token_count": 507,
"component": "workflow_refactor",
"toolCallId": "toolu_019y5gNwLGrkAQmJQDY8u4Ub",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " updateState(ctx: WorkflowState, nextStep?: ProcessingStep) {\n this.setState(ctx.id, {\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n aiSummary: ctx.aiSummary,\n customPrompt: ctx.customPrompt,\n customSegmentationPrompt: ctx.customSegmentationPrompt,\n customSummaryPrompt: ctx.customSummaryPrompt,\n customAnalysisPrompt: ctx.customAnalysisPrompt,\n customColoringPrompt: ctx.customColoringPrompt,\n components: ctx.components,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n status: \"success\",\n step: nextStep,\n });",
"new_string": " updateState(ctx: WorkflowState, nextStep?: ProcessingStep) {\n this.setState(ctx.id, {\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n aiSummary: ctx.aiSummary,\n customPrompt: ctx.customPrompt,\n customSegmentationPrompt: ctx.customSegmentationPrompt,\n customSummaryPrompt: ctx.customSummaryPrompt,\n customAnalysisPrompt: ctx.customAnalysisPrompt,\n customColoringPrompt: ctx.customColoringPrompt,\n components: ctx.components,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n dimensions: ctx.dimensions,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n status: \"success\",\n step: nextStep,\n });"
}
}
]
},
{
"id": "204",
"role": "tool",
"timestamp": "2026-03-09T18:32:42.808Z",
"parts": [
{
"id": "205",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_019y5gNwLGrkAQmJQDY8u4Ub",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "207",
"role": "assistant",
"timestamp": "2026-03-09T18:32:50.180Z",
"parts": [
{
"id": "206",
"type": "tool-call",
"token_count": 507,
"component": "workflow_refactor",
"toolCallId": "toolu_01W2XvAkd1njHCFrYriYsTrd",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " markComplete(ctx: WorkflowState) {\n this.setState(ctx.id, {\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n title: ctx.title,\n aiSummary: ctx.aiSummary,\n customPrompt: ctx.customPrompt,\n customSegmentationPrompt: ctx.customSegmentationPrompt,\n customSummaryPrompt: ctx.customSummaryPrompt,\n customAnalysisPrompt: ctx.customAnalysisPrompt,\n customColoringPrompt: ctx.customColoringPrompt,\n components: ctx.components,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n status: \"success\",\n step: undefined,\n });",
"new_string": " markComplete(ctx: WorkflowState) {\n this.setState(ctx.id, {\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n title: ctx.title,\n aiSummary: ctx.aiSummary,\n customPrompt: ctx.customPrompt,\n customSegmentationPrompt: ctx.customSegmentationPrompt,\n customSummaryPrompt: ctx.customSummaryPrompt,\n customAnalysisPrompt: ctx.customAnalysisPrompt,\n customColoringPrompt: ctx.customColoringPrompt,\n components: ctx.components,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n dimensions: ctx.dimensions,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n status: \"success\",\n step: undefined,\n });"
}
}
]
},
{
"id": "208",
"role": "tool",
"timestamp": "2026-03-09T18:32:50.233Z",
"parts": [
{
"id": "209",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01W2XvAkd1njHCFrYriYsTrd",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "212",
"role": "assistant",
"timestamp": "2026-03-09T18:32:54.263Z",
"parts": [
{
"id": "210",
"type": "text",
"token_count": 48,
"component": "workflow_refactor",
"text": "### Step 6: Update the workflow to store dimensions from activity results\n\nNow I need to update `processConversationWorkflow` where it uses `findComponentsActivity` and `assignColorsActivity` results. The activities now return `dimensions`."
},
{
"id": "211",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01WXR6NKQBaPL3HrJd4hkxvb",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 30,
"offset": 695
}
}
]
},
{
"id": "213",
"role": "tool",
"timestamp": "2026-03-09T18:32:54.868Z",
"parts": [
{
"id": "214",
"type": "tool-result",
"token_count": 399,
"component": "workflow_refactor",
"toolCallId": "toolu_01WXR6NKQBaPL3HrJd4hkxvb",
"toolName": "Read",
"output": " 695→ ctx.stepTimings!.summary = summaryTiming;\n 696→\n 697→ if (ctx.regenerateAnalysis) {\n 698→ ctx.analysis = \"\";\n 699→ runner.startStep(ctx, \"analysis\");\n 700→ const { result: analysisResult, timing: analysisTiming } =\n 701→ await runner.runActivity(\n 702→ ctx,\n 703→ createAnalysisActivity(callbacks.onAnalysisChunk),\n 704→ \"analysis\",\n 705→ );\n 706→ ctx.analysis = analysisResult.analysis;\n 707→ if (analysisResult.error) ctx.warnings!.push(analysisResult.error);\n 708→ ctx.stepTimings!.analysis = analysisTiming;\n 709→ }\n 710→\n 711→ runner.markComplete(ctx);\n 712→ return;\n 713→ }\n 714→\n 715→ // Resume from API key pause - continue from segmenting step\n 716→ if (event === WorkflowEvent.ResumeFromApiKeyPause) {\n 717→ // Step 3: Segment\n 718→ runner.startStep(ctx, \"segmenting\");\n 719→ const { result: segmentResult, timing: segmentTiming } =\n 720→ await runner.runActivity(ctx, segmentActivity, \"segmenting\");\n 721→\n 722→ ctx.conversation = segmentResult.conversation;\n 723→ if (segmentResult.error) ctx.warnings!.push(segmentResult.error);\n 724→ ctx.stepTimings!.segmenting = segmentTiming;"
}
]
},
{
"id": "216",
"role": "assistant",
"timestamp": "2026-03-09T18:33:01.669Z",
"parts": [
{
"id": "215",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01KyhvP3khjyURt82sY5xbyF",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 40,
"offset": 724
}
}
]
},
{
"id": "217",
"role": "tool",
"timestamp": "2026-03-09T18:33:01.707Z",
"parts": [
{
"id": "218",
"type": "tool-result",
"token_count": 519,
"component": "workflow_refactor",
"toolCallId": "toolu_01KyhvP3khjyURt82sY5xbyF",
"toolName": "Read",
"output": " 724→ ctx.stepTimings!.segmenting = segmentTiming;\n 725→\n 726→ runner.updateState(ctx, \"finding-components\");\n 727→\n 728→ // Step 4: Find components\n 729→ runner.startStep(ctx, \"finding-components\");\n 730→ const { result: componentResult, timing: componentTiming } =\n 731→ await runner.runActivity(\n 732→ ctx,\n 733→ findComponentsActivity,\n 734→ \"finding-components\",\n 735→ );\n 736→ ctx.components = componentResult.components;\n 737→ ctx.componentMapping = componentResult.mapping;\n 738→ ctx.componentTimeline = componentResult.timeline;\n 739→ if (componentResult.error) ctx.warnings!.push(componentResult.error);\n 740→ ctx.stepTimings![\"finding-components\"] = componentTiming;\n 741→ runner.updateState(ctx, \"coloring\");\n 742→\n 743→ // Step 5: Assign colors\n 744→ runner.startStep(ctx, \"coloring\");\n 745→ const { result: colorResult, timing: colorTiming } =\n 746→ await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n 747→ ctx.componentColors = colorResult.colors;\n 748→ ctx.stepTimings!.coloring = colorTiming;\n 749→\n 750→ runner.markComplete(ctx);\n 751→ return;\n 752→ }\n 753→\n 754→ // Step 1: Parse (only for new files)\n 755→ if (event === WorkflowEvent.NewFile) {\n 756→ runner.startStep(ctx, \"parsing\");\n 757→ const { result, timing } = await runner.runActivity(\n 758→ ctx,\n 759→ parseActivity,\n 760→ \"parsing\",\n 761→ );\n 762→ ctx.conversation = result.conversation;\n 763→ ctx.summary = result.summary;"
}
]
},
{
"id": "221",
"role": "assistant",
"timestamp": "2026-03-09T18:33:06.318Z",
"parts": [
{
"id": "219",
"type": "text",
"token_count": 33,
"component": "workflow_refactor",
"text": "I need to update every place where `componentResult` and `colorResult` are used. There are multiple occurrences. Let me find them all and update them."
},
{
"id": "220",
"type": "tool-call",
"token_count": 65,
"component": "workflow_refactor",
"toolCallId": "toolu_01Mt2TddJ9wj2BBaw4k5kpW5",
"toolName": "Grep",
"input": {
"pattern": "ctx\\.components = componentResult|ctx\\.componentMapping = componentResult|ctx\\.componentTimeline = componentResult|ctx\\.componentColors = colorResult",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "222",
"role": "tool",
"timestamp": "2026-03-09T18:33:07.857Z",
"parts": [
{
"id": "223",
"type": "tool-result",
"token_count": 108,
"component": "workflow_refactor",
"toolCallId": "toolu_01Mt2TddJ9wj2BBaw4k5kpW5",
"toolName": "Grep",
"output": "736: ctx.components = componentResult.components;\n737: ctx.componentMapping = componentResult.mapping;\n738: ctx.componentTimeline = componentResult.timeline;\n747: ctx.componentColors = colorResult.colors;\n879: ctx.componentColors = colorResult.colors;\n910: ctx.components = componentResult.components;\n911: ctx.componentMapping = componentResult.mapping;\n912: ctx.componentTimeline = componentResult.timeline;\n921: ctx.componentColors = colorResult.colors;"
}
]
},
{
"id": "226",
"role": "assistant",
"timestamp": "2026-03-09T18:33:12.420Z",
"parts": [
{
"id": "224",
"type": "text",
"token_count": 21,
"component": "workflow_refactor",
"text": "Let me update each occurrence to also store `dimensions`. There are 3 groups of component result usage:"
},
{
"id": "225",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01JryP65v624Tho2JRDvwLoR",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 5,
"offset": 734
}
}
]
},
{
"id": "227",
"role": "tool",
"timestamp": "2026-03-09T18:33:13.111Z",
"parts": [
{
"id": "228",
"type": "tool-result",
"token_count": 60,
"component": "workflow_refactor",
"toolCallId": "toolu_01JryP65v624Tho2JRDvwLoR",
"toolName": "Read",
"output": " 734→ \"finding-components\",\n 735→ );\n 736→ ctx.components = componentResult.components;\n 737→ ctx.componentMapping = componentResult.mapping;\n 738→ ctx.componentTimeline = componentResult.timeline;"
}
]
},
{
"id": "230",
"role": "assistant",
"timestamp": "2026-03-09T18:33:16.854Z",
"parts": [
{
"id": "229",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01CfvN7hEo2BetjAB4UKyijH",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 20,
"offset": 736
}
}
]
},
{
"id": "231",
"role": "tool",
"timestamp": "2026-03-09T18:33:16.899Z",
"parts": [
{
"id": "232",
"type": "tool-result",
"token_count": 280,
"component": "workflow_refactor",
"toolCallId": "toolu_01CfvN7hEo2BetjAB4UKyijH",
"toolName": "Read",
"output": " 736→ ctx.components = componentResult.components;\n 737→ ctx.componentMapping = componentResult.mapping;\n 738→ ctx.componentTimeline = componentResult.timeline;\n 739→ if (componentResult.error) ctx.warnings!.push(componentResult.error);\n 740→ ctx.stepTimings![\"finding-components\"] = componentTiming;\n 741→ runner.updateState(ctx, \"coloring\");\n 742→\n 743→ // Step 5: Assign colors\n 744→ runner.startStep(ctx, \"coloring\");\n 745→ const { result: colorResult, timing: colorTiming } =\n 746→ await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n 747→ ctx.componentColors = colorResult.colors;\n 748→ ctx.stepTimings!.coloring = colorTiming;\n 749→\n 750→ runner.markComplete(ctx);\n 751→ return;\n 752→ }\n 753→\n 754→ // Step 1: Parse (only for new files)\n 755→ if (event === WorkflowEvent.NewFile) {"
}
]
},
{
"id": "235",
"role": "assistant",
"timestamp": "2026-03-09T18:33:20.577Z",
"parts": [
{
"id": "233",
"type": "text",
"token_count": 15,
"component": "workflow_refactor",
"text": "I'll update all three occurrences. First occurrence (ResumeFromApiKeyPause):"
},
{
"id": "234",
"type": "tool-call",
"token_count": 423,
"component": "workflow_refactor",
"toolCallId": "toolu_016qNfgsci9EzkEcqq6d3QpU",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " ctx.components = componentResult.components;\n ctx.componentMapping = componentResult.mapping;\n ctx.componentTimeline = componentResult.timeline;\n if (componentResult.error) ctx.warnings!.push(componentResult.error);\n ctx.stepTimings![\"finding-components\"] = componentTiming;\n runner.updateState(ctx, \"coloring\");\n\n // Step 5: Assign colors\n runner.startStep(ctx, \"coloring\");\n const { result: colorResult, timing: colorTiming } =\n await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n ctx.componentColors = colorResult.colors;\n ctx.stepTimings!.coloring = colorTiming;\n\n runner.markComplete(ctx);\n return;\n }\n\n // Step 1: Parse (only for new files)",
"new_string": " ctx.components = componentResult.components;\n ctx.componentMapping = componentResult.mapping;\n ctx.componentTimeline = componentResult.timeline;\n ctx.dimensions = componentResult.dimensions;\n if (componentResult.error) ctx.warnings!.push(componentResult.error);\n ctx.stepTimings![\"finding-components\"] = componentTiming;\n runner.updateState(ctx, \"coloring\");\n\n // Step 5: Assign colors\n runner.startStep(ctx, \"coloring\");\n const { result: colorResult, timing: colorTiming } =\n await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n ctx.componentColors = colorResult.colors;\n ctx.dimensions = colorResult.dimensions;\n ctx.stepTimings!.coloring = colorTiming;\n\n runner.markComplete(ctx);\n return;\n }\n\n // Step 1: Parse (only for new files)"
}
}
]
},
{
"id": "236",
"role": "tool",
"timestamp": "2026-03-09T18:33:24.452Z",
"parts": [
{
"id": "237",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_016qNfgsci9EzkEcqq6d3QpU",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "240",
"role": "assistant",
"timestamp": "2026-03-09T18:33:29.029Z",
"parts": [
{
"id": "238",
"type": "text",
"token_count": 17,
"component": "workflow_refactor",
"text": "Now the second and third occurrences. Let me read around lines 875-925:"
},
{
"id": "239",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01X2d4C46UWMVGKe4HTXoncY",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 50,
"offset": 870
}
}
]
},
{
"id": "241",
"role": "tool",
"timestamp": "2026-03-09T18:33:29.355Z",
"parts": [
{
"id": "242",
"type": "tool-result",
"token_count": 693,
"component": "workflow_refactor",
"toolCallId": "toolu_01X2d4C46UWMVGKe4HTXoncY",
"toolName": "Read",
"output": " 870→ if (summaryResult.error) ctx.warnings!.push(summaryResult.error);\n 871→ ctx.stepTimings!.summary = summaryTiming;\n 872→ runner.markComplete(ctx);\n 873→ return;\n 874→ }\n 875→\n 876→ // For coloring prompt changed, only re-run the coloring step\n 877→ if (event === WorkflowEvent.ColoringPromptChanged) {\n 878→ runner.startStep(ctx, \"coloring\");\n 879→ const { result: colorResult, timing: colorTiming } =\n 880→ await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n 881→ ctx.componentColors = colorResult.colors;\n 882→ ctx.stepTimings!.coloring = colorTiming;\n 883→ runner.markComplete(ctx);\n 884→ return;\n 885→ }\n 886→\n 887→ // For segmentation prompt changed, start from segmenting step\n 888→ if (event === WorkflowEvent.SegmentationPromptChanged) {\n 889→ runner.startStep(ctx, \"segmenting\");\n 890→ const { result: segmentResult, timing: segmentTiming } =\n 891→ await runner.runActivity(ctx, segmentActivity, \"segmenting\");\n 892→\n 893→ ctx.conversation = segmentResult.conversation;\n 894→ if (segmentResult.error) ctx.warnings!.push(segmentResult.error);\n 895→ ctx.stepTimings!.segmenting = segmentTiming;\n 896→\n 897→ runner.updateState(ctx, \"finding-components\");\n 898→ }\n 899→\n 900→ // Step 4: Find components (skip for grouped conversations and analysis-only)\n 901→ if (\n 902→ event !== WorkflowEvent.GroupedConversation &&\n 903→ event !== WorkflowEvent.GenerateAnalysis\n 904→ ) {\n 905→ runner.startStep(ctx, \"finding-components\");\n 906→ const { result: componentResult, timing: componentTiming } =\n 907→ await runner.runActivity(\n 908→ ctx,\n 909→ findComponentsActivity,\n 910→ \"finding-components\",\n 911→ );\n 912→ ctx.components = componentResult.components;\n 913→ ctx.componentMapping = componentResult.mapping;\n 914→ ctx.componentTimeline = componentResult.timeline;\n 915→ if (componentResult.error) ctx.warnings!.push(componentResult.error);\n 916→ ctx.stepTimings![\"finding-components\"] = componentTiming;\n 917→ runner.updateState(ctx, \"coloring\");\n 918→\n 919→ // Step 5: Assign colors (skip for grouped conversations - colors already merged)"
}
]
},
{
"id": "244",
"role": "assistant",
"timestamp": "2026-03-09T18:33:34.176Z",
"parts": [
{
"id": "243",
"type": "tool-call",
"token_count": 30,
"component": "workflow_refactor",
"toolCallId": "toolu_01WvSDDu3nbbPMBBvfDRpDLS",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 20,
"offset": 919
}
}
]
},
{
"id": "245",
"role": "tool",
"timestamp": "2026-03-09T18:33:34.214Z",
"parts": [
{
"id": "246",
"type": "tool-result",
"token_count": 285,
"component": "workflow_refactor",
"toolCallId": "toolu_01WvSDDu3nbbPMBBvfDRpDLS",
"toolName": "Read",
"output": " 919→ // Step 5: Assign colors (skip for grouped conversations - colors already merged)\n 920→ runner.startStep(ctx, \"coloring\");\n 921→ const { result: colorResult, timing: colorTiming } =\n 922→ await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n 923→ ctx.componentColors = colorResult.colors;\n 924→ ctx.stepTimings!.coloring = colorTiming;\n 925→\n 926→ // For new files, mark complete without analysis (user can trigger it manually)\n 927→ if (event === WorkflowEvent.NewFile) {\n 928→ runner.markComplete(ctx);\n 929→ return;\n 930→ }\n 931→\n 932→ runner.updateState(ctx, \"analysis\");\n 933→ }\n 934→\n 935→ // Step 6: Generate analysis (only for explicit analysis generation or reprocessing)\n 936→ // Run for: GenerateAnalysis, ComponentPromptChanged, SegmentationPromptChanged\n 937→ if (\n 938→ event === WorkflowEvent.GenerateAnalysis ||"
}
]
},
{
"id": "248",
"role": "assistant",
"timestamp": "2026-03-09T18:33:40.006Z",
"parts": [
{
"id": "247",
"type": "tool-call",
"token_count": 146,
"component": "workflow_refactor",
"toolCallId": "toolu_01JT2n34SYFfFtDCXd2uBQBa",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " ctx.componentColors = colorResult.colors;\n ctx.stepTimings!.coloring = colorTiming;\n runner.markComplete(ctx);\n return;\n }\n\n // For segmentation prompt changed, start from segmenting step",
"new_string": " ctx.componentColors = colorResult.colors;\n ctx.dimensions = colorResult.dimensions;\n ctx.stepTimings!.coloring = colorTiming;\n runner.markComplete(ctx);\n return;\n }\n\n // For segmentation prompt changed, start from segmenting step"
}
}
]
},
{
"id": "249",
"role": "tool",
"timestamp": "2026-03-09T18:33:40.056Z",
"parts": [
{
"id": "250",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01JT2n34SYFfFtDCXd2uBQBa",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "252",
"role": "assistant",
"timestamp": "2026-03-09T18:33:47.336Z",
"parts": [
{
"id": "251",
"type": "tool-call",
"token_count": 383,
"component": "workflow_refactor",
"toolCallId": "toolu_01NZ8uRDNBKT9RWz4bPk1WTz",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " ctx.components = componentResult.components;\n ctx.componentMapping = componentResult.mapping;\n ctx.componentTimeline = componentResult.timeline;\n if (componentResult.error) ctx.warnings!.push(componentResult.error);\n ctx.stepTimings![\"finding-components\"] = componentTiming;\n runner.updateState(ctx, \"coloring\");\n\n // Step 5: Assign colors (skip for grouped conversations - colors already merged)\n runner.startStep(ctx, \"coloring\");\n const { result: colorResult, timing: colorTiming } =\n await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n ctx.componentColors = colorResult.colors;\n ctx.stepTimings!.coloring = colorTiming;",
"new_string": " ctx.components = componentResult.components;\n ctx.componentMapping = componentResult.mapping;\n ctx.componentTimeline = componentResult.timeline;\n ctx.dimensions = componentResult.dimensions;\n if (componentResult.error) ctx.warnings!.push(componentResult.error);\n ctx.stepTimings![\"finding-components\"] = componentTiming;\n runner.updateState(ctx, \"coloring\");\n\n // Step 5: Assign colors (skip for grouped conversations - colors already merged)\n runner.startStep(ctx, \"coloring\");\n const { result: colorResult, timing: colorTiming } =\n await runner.runActivity(ctx, assignColorsActivity, \"coloring\");\n ctx.componentColors = colorResult.colors;\n ctx.dimensions = colorResult.dimensions;\n ctx.stepTimings!.coloring = colorTiming;"
}
}
]
},
{
"id": "253",
"role": "tool",
"timestamp": "2026-03-09T18:33:47.412Z",
"parts": [
{
"id": "254",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01NZ8uRDNBKT9RWz4bPk1WTz",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "257",
"role": "assistant",
"timestamp": "2026-03-09T18:33:51.522Z",
"parts": [
{
"id": "255",
"type": "text",
"token_count": 16,
"component": "workflow_refactor",
"text": "### Step 7: Update buildBaseContext and runWorkflows to include dimensions"
},
{
"id": "256",
"type": "tool-call",
"token_count": 31,
"component": "workflow_refactor",
"toolCallId": "toolu_01LJaJnNuZEedMmA22QYtn7V",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 30,
"offset": 1726
}
}
]
},
{
"id": "258",
"role": "tool",
"timestamp": "2026-03-09T18:33:52.234Z",
"parts": [
{
"id": "259",
"type": "tool-result",
"token_count": 425,
"component": "workflow_refactor",
"toolCallId": "toolu_01LJaJnNuZEedMmA22QYtn7V",
"toolName": "Read",
"output": " 1726→ const handleToggleInsightsPanel = () => {\n 1727→ setInsightsCollapsed(!isInsightsPanelCollapsed);\n 1728→ };\n 1729→\n 1730→ // Helper: Build base context from selected conversation\n 1731→ const buildBaseContext = (conv: WorkflowState): WorkflowState => ({\n 1732→ id: conv.id,\n 1733→ filename: conv.filename,\n 1734→ conversation: conv.conversation,\n 1735→ summary: conv.summary,\n 1736→ metadata: conv.metadata,\n 1737→ aiSummary: conv.aiSummary,\n 1738→ analysis: conv.analysis,\n 1739→ components: conv.components,\n 1740→ componentMapping: conv.componentMapping,\n 1741→ componentTimeline: conv.componentTimeline,\n 1742→ componentColors: conv.componentColors,\n 1743→ staticComponents: conv.staticComponents,\n 1744→ staticMapping: conv.staticMapping,\n 1745→ staticTimeline: conv.staticTimeline,\n 1746→ customSummaryPrompt: conv.customSummaryPrompt,\n 1747→ customSegmentationPrompt: conv.customSegmentationPrompt,\n 1748→ customAnalysisPrompt: conv.customAnalysisPrompt,\n 1749→ customColoringPrompt: conv.customColoringPrompt,\n 1750→ segmentationThreshold: conv.segmentationThreshold,\n 1751→ customPrompt: conv.customPrompt,\n 1752→ config: conv.config || getComponentisationConfig(),\n 1753→ warnings: [],\n 1754→ stepTimings: { ...conv.stepTimings },\n 1755→ });"
}
]
},
{
"id": "261",
"role": "assistant",
"timestamp": "2026-03-09T18:34:00.838Z",
"parts": [
{
"id": "260",
"type": "tool-call",
"token_count": 540,
"component": "workflow_refactor",
"toolCallId": "toolu_01UQEBfF82xNorTsGLxNzgQb",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " // Helper: Build base context from selected conversation\n const buildBaseContext = (conv: WorkflowState): WorkflowState => ({\n id: conv.id,\n filename: conv.filename,\n conversation: conv.conversation,\n summary: conv.summary,\n metadata: conv.metadata,\n aiSummary: conv.aiSummary,\n analysis: conv.analysis,\n components: conv.components,\n componentMapping: conv.componentMapping,\n componentTimeline: conv.componentTimeline,\n componentColors: conv.componentColors,\n staticComponents: conv.staticComponents,\n staticMapping: conv.staticMapping,\n staticTimeline: conv.staticTimeline,\n customSummaryPrompt: conv.customSummaryPrompt,\n customSegmentationPrompt: conv.customSegmentationPrompt,\n customAnalysisPrompt: conv.customAnalysisPrompt,\n customColoringPrompt: conv.customColoringPrompt,\n segmentationThreshold: conv.segmentationThreshold,\n customPrompt: conv.customPrompt,\n config: conv.config || getComponentisationConfig(),\n warnings: [],\n stepTimings: { ...conv.stepTimings },\n });",
"new_string": " // Helper: Build base context from selected conversation\n const buildBaseContext = (conv: WorkflowState): WorkflowState => ({\n id: conv.id,\n filename: conv.filename,\n conversation: conv.conversation,\n summary: conv.summary,\n metadata: conv.metadata,\n aiSummary: conv.aiSummary,\n analysis: conv.analysis,\n components: conv.components,\n componentMapping: conv.componentMapping,\n componentTimeline: conv.componentTimeline,\n componentColors: conv.componentColors,\n dimensions: conv.dimensions ? { ...conv.dimensions } : undefined,\n staticComponents: conv.staticComponents,\n staticMapping: conv.staticMapping,\n staticTimeline: conv.staticTimeline,\n customSummaryPrompt: conv.customSummaryPrompt,\n customSegmentationPrompt: conv.customSegmentationPrompt,\n customAnalysisPrompt: conv.customAnalysisPrompt,\n customColoringPrompt: conv.customColoringPrompt,\n segmentationThreshold: conv.segmentationThreshold,\n customPrompt: conv.customPrompt,\n config: conv.config || getComponentisationConfig(),\n warnings: [],\n stepTimings: { ...conv.stepTimings },\n });"
}
}
]
},
{
"id": "262",
"role": "tool",
"timestamp": "2026-03-09T18:34:00.891Z",
"parts": [
{
"id": "263",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01UQEBfF82xNorTsGLxNzgQb",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "266",
"role": "assistant",
"timestamp": "2026-03-09T18:34:05.483Z",
"parts": [
{
"id": "264",
"type": "text",
"token_count": 17,
"component": "workflow_refactor",
"text": "Now update `runWorkflows` to return `dimensions` in the final state:"
},
{
"id": "265",
"type": "tool-call",
"token_count": 31,
"component": "workflow_refactor",
"toolCallId": "toolu_013xbGj3RU9fPN9ucShNyoWa",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 30,
"offset": 1025
}
}
]
},
{
"id": "267",
"role": "tool",
"timestamp": "2026-03-09T18:34:05.943Z",
"parts": [
{
"id": "268",
"type": "tool-result",
"token_count": 392,
"component": "workflow_refactor",
"toolCallId": "toolu_013xbGj3RU9fPN9ucShNyoWa",
"toolName": "Read",
"output": " 1025→\n 1026→ // Run workflow with NewFile event\n 1027→ await processConversationWorkflow(WorkflowEvent.NewFile, ctx, runner, {\n 1028→ onSummaryChunk: onAISummaryChunk,\n 1029→ onAnalysisChunk: onAnalysisChunk,\n 1030→ });\n 1031→\n 1032→ // Return final parsed conversation\n 1033→ return {\n 1034→ id,\n 1035→ filename: file.name,\n 1036→ status: ctx.conversation ? \"success\" : \"failed\",\n 1037→ conversation: ctx.conversation,\n 1038→ summary: ctx.summary,\n 1039→ metadata: ctx.metadata,\n 1040→ aiSummary: ctx.aiSummary,\n 1041→ components: ctx.components,\n 1042→ componentMapping: ctx.componentMapping,\n 1043→ componentTimeline: ctx.componentTimeline,\n 1044→ componentColors: ctx.componentColors,\n 1045→ staticComponents: ctx.staticComponents,\n 1046→ staticMapping: ctx.staticMapping,\n 1047→ staticTimeline: ctx.staticTimeline,\n 1048→ analysis: ctx.analysis,\n 1049→ warnings:\n 1050→ ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n 1051→ stepTimings: ctx.stepTimings,\n 1052→ } as WorkflowState;\n 1053→ }),\n 1054→ );"
}
]
},
{
"id": "270",
"role": "assistant",
"timestamp": "2026-03-09T18:34:13.364Z",
"parts": [
{
"id": "269",
"type": "tool-call",
"token_count": 397,
"component": "workflow_refactor",
"toolCallId": "toolu_01RxasoZobhekymZAKTx1mAe",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " // Return final parsed conversation\n return {\n id,\n filename: file.name,\n status: ctx.conversation ? \"success\" : \"failed\",\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n aiSummary: ctx.aiSummary,\n components: ctx.components,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n } as WorkflowState;",
"new_string": " // Return final parsed conversation\n return {\n id,\n filename: file.name,\n status: ctx.conversation ? \"success\" : \"failed\",\n conversation: ctx.conversation,\n summary: ctx.summary,\n metadata: ctx.metadata,\n aiSummary: ctx.aiSummary,\n components: ctx.components,\n componentMapping: ctx.componentMapping,\n componentTimeline: ctx.componentTimeline,\n componentColors: ctx.componentColors,\n dimensions: ctx.dimensions,\n staticComponents: ctx.staticComponents,\n staticMapping: ctx.staticMapping,\n staticTimeline: ctx.staticTimeline,\n analysis: ctx.analysis,\n warnings:\n ctx.warnings && ctx.warnings.length > 0 ? ctx.warnings : undefined,\n stepTimings: ctx.stepTimings,\n } as WorkflowState;"
}
}
]
},
{
"id": "271",
"role": "tool",
"timestamp": "2026-03-09T18:34:13.463Z",
"parts": [
{
"id": "272",
"type": "tool-result",
"token_count": 24,
"component": "ui_changes",
"toolCallId": "toolu_01RxasoZobhekymZAKTx1mAe",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "275",
"role": "assistant",
"timestamp": "2026-03-09T18:34:18.179Z",
"parts": [
{
"id": "273",
"type": "text",
"token_count": 9,
"component": "tests_and_build",
"text": "Now let me verify the app compiles:"
},
{
"id": "274",
"type": "tool-call",
"token_count": 33,
"component": "tests_and_build",
"toolCallId": "toolu_01EH5jyAncw1WJhEesvoJcdc",
"toolName": "Bash",
"input": {
"command": "npx tsc --noEmit 2>&1 | head -40",
"description": "Check TypeScript compilation",
"timeout": 30000
}
}
]
},
{
"id": "276",
"role": "tool",
"timestamp": "2026-03-09T18:34:24.007Z",
"parts": [
{
"id": "277",
"type": "tool-result",
"token_count": 536,
"component": "tests_and_build",
"toolCallId": "toolu_01EH5jyAncw1WJhEesvoJcdc",
"toolName": "Bash",
"output": "src/App.tsx(903,7): error TS2367: This comparison appears to be unintentional because the types 'WorkflowEvent.NewFile | WorkflowEvent.ComponentPromptChanged | WorkflowEvent.SegmentationPromptChanged | WorkflowEvent.GenerateAnalysis' and 'WorkflowEvent.GroupedConversation' have no overlap.\nsrc/App.tsx(2659,45): error TS2339: Property 'filter' does not exist on type 'Map<number, string>'.\nsrc/App.tsx(2659,53): error TS7006: Parameter 'fid' implicitly has an 'any' type.\nsrc/App.tsx(2730,32): error TS18048: 'fileExport' is possibly 'undefined'.\nsrc/App.tsx(2737,17): error TS18048: 'fileExport' is possibly 'undefined'.\nsrc/components/GroupFileOrderEditor.tsx(118,48): error TS2532: Object is possibly 'undefined'.\nsrc/lib/url-fetch.ts(36,18): error TS2532: Object is possibly 'undefined'.\nsrc/parsers/claude-transcripts-parser.ts(140,27): error TS2345: Argument of type 'unknown' is not assignable to parameter of type 'string'.\nsrc/parsers/claude-transcripts-parser.ts(299,13): error TS2322: Type 'unknown' is not assignable to type 'string'.\nsrc/parsers/claude-transcripts-parser.ts(306,20): error TS18046: 'block.source' is of type 'unknown'.\nsrc/parsers/claude-transcripts-parser.ts(307,24): error TS18046: 'block.source' is of type 'unknown'.\nsrc/parsers/claude-transcripts-parser.ts(375,13): error TS2322: Type 'unknown' is not assignable to type 'string'.\nsrc/parsers/claude-transcripts-parser.ts(383,13): error TS2322: Type 'unknown' is not assignable to type 'string'.\nsrc/parsers/claude-transcripts-parser.ts(391,13): error TS2322: Type 'unknown' is not assignable to type 'string'.\nsrc/parsers/claude-transcripts-parser.ts(392,13): error TS2322: Type 'unknown' is not assignable to type 'string'.\nsrc/parsers/codex-transcripts-parser.ts(176,15): error TS18046: 'payload' is of type 'unknown'."
}
]
},
{
"id": "280",
"role": "assistant",
"timestamp": "2026-03-09T18:34:28.546Z",
"parts": [
{
"id": "278",
"type": "text",
"token_count": 47,
"component": "tests_and_build",
"text": "Most errors are pre-existing (unrelated to my changes). The only one in App.tsx are on lines 903, 2659, 2730, 2737 - let me check if 903 is pre-existing:"
},
{
"id": "279",
"type": "tool-call",
"token_count": 39,
"component": "tests_and_build",
"toolCallId": "toolu_011Bmmhy82vTKsK84ezRR2WV",
"toolName": "Bash",
"input": {
"command": "npx tsc --noEmit 2>&1 | grep -c \"App.tsx\"",
"description": "Count App.tsx errors",
"timeout": 30000
}
}
]
},
{
"id": "281",
"role": "tool",
"timestamp": "2026-03-09T18:34:33.904Z",
"parts": [
{
"id": "282",
"type": "tool-result",
"token_count": 5,
"component": "tests_and_build",
"toolCallId": "toolu_011Bmmhy82vTKsK84ezRR2WV",
"toolName": "Bash",
"output": "5"
}
]
},
{
"id": "284",
"role": "assistant",
"timestamp": "2026-03-09T18:34:40.620Z",
"parts": [
{
"id": "283",
"type": "tool-call",
"token_count": 46,
"component": "tests_and_build",
"toolCallId": "toolu_01PgQCshBzgPKFq2D9WaFiZN",
"toolName": "Bash",
"input": {
"command": "git stash && npx tsc --noEmit 2>&1 | grep \"App.tsx\" ; git stash pop",
"description": "Check pre-existing App.tsx errors",
"timeout": 30000
}
}
]
},
{
"id": "285",
"role": "tool",
"timestamp": "2026-03-09T18:37:48.649Z",
"parts": [
{
"id": "286",
"type": "tool-result",
"token_count": 372,
"component": "tests_and_build",
"toolCallId": "toolu_01PgQCshBzgPKFq2D9WaFiZN",
"toolName": "Bash",
"output": "Saved working directory and index state WIP on multiple-components: f355ab0 Add component descriptions to prompt\nsrc/App.tsx(788,7): error TS2367: This comparison appears to be unintentional because the types 'WorkflowEvent.NewFile | WorkflowEvent.ComponentPromptChanged | WorkflowEvent.SegmentationPromptChanged | WorkflowEvent.GenerateAnalysis' and 'WorkflowEvent.GroupedConversation' have no overlap.\nsrc/App.tsx(2540,45): error TS2339: Property 'filter' does not exist on type 'Map<number, string>'.\nsrc/App.tsx(2540,53): error TS7006: Parameter 'fid' implicitly has an 'any' type.\nsrc/App.tsx(2611,32): error TS18048: 'fileExport' is possibly 'undefined'.\nsrc/App.tsx(2618,17): error TS18048: 'fileExport' is possibly 'undefined'.\nOn branch multiple-components\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\tmodified: .claude/settings.local.json\n\tmodified: docs/prompts.md\n\tmodified: src/App.tsx\n\tmodified: src/componentisation.ts\n\tmodified: src/lib/component-colors.ts\n\tmodified: src/prompts.ts\n\tmodified: src/segmentation.ts\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nDropped refs/stash@{0} (8123ccaa4ed12318f0320ad5f40e57ecedbddae0)"
}
]
},
{
"id": "289",
"role": "assistant",
"timestamp": "2026-03-09T18:37:59.161Z",
"parts": [
{
"id": "287",
"type": "text",
"token_count": 124,
"component": "ui_changes",
"text": "All 5 App.tsx errors are pre-existing (same errors, just different line numbers due to my additions). No new errors from my changes.\n\n### Step 8: Now the UI - Add dimension management to the sidebar and pass dimensions to views\n\nLet me now work on the UI changes. I'll need to:\n1. Add `activeDimensions` state to App\n2. Add dimension management UI (accordion in sidebar)\n3. Pass dimensions to ConversationView and its children\n4. Update the component views to support dimension selection\n\nLet me first look at the ConversationList sidebar to understand the prompt editor buttons:"
},
{
"id": "288",
"type": "tool-call",
"token_count": 33,
"component": "understanding_codebase",
"toolCallId": "toolu_01FsbjeDL1vdg1rLFT3YqYEr",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationList.tsx",
"limit": 50,
"offset": 75
}
}
]
},
{
"id": "290",
"role": "tool",
"timestamp": "2026-03-09T18:37:59.712Z",
"parts": [
{
"id": "291",
"type": "tool-result",
"token_count": 715,
"component": "understanding_codebase",
"toolCallId": "toolu_01FsbjeDL1vdg1rLFT3YqYEr",
"toolName": "Read",
"output": " 75→ onToggleSelection: (id: string, isSelected: boolean) => void;\n 76→ onGroupConversations: () => void;\n 77→ onClearSelection: () => void;\n 78→ onSelectAll: (ids: string[]) => void;\n 79→ onUngroupConversation: (id: string) => void;\n 80→ onDeleteConversation?: (id: string) => void;\n 81→ onRename?: (id: string, newTitle: string) => void;\n 82→ onGenerateAnalysis?: (id: string) => void;\n 83→ onGenerateSummary?: (id: string) => void;\n 84→ onFilesSelected: (files: File[]) => void;\n 85→ onEditPrompt?: (id: string) => void;\n 86→ onEditComponents?: (id: string) => void;\n 87→ onEditSegmentationPrompt?: (id: string) => void;\n 88→ onEditSummaryPrompt?: (id: string) => void;\n 89→ onEditAnalysisPrompt?: (id: string) => void;\n 90→ onEditColoringPrompt?: (id: string) => void;\n 91→ onApplyPromptsToAll?: (id: string) => void;\n 92→ onExportPromptsAsPreset?: (id: string) => void;\n 93→ onExportSession?: () => void;\n 94→ onUpdateGroupSources?: (groupId: string, newSources: Array<{ id: string; filename: string; title?: string }>) => void;\n 95→ isCollapsed?: boolean;\n 96→ onToggleCollapse?: () => void;\n 97→ pausedWorkflowCount?: number;\n 98→ onApiKeyChange?: (hasKey: boolean) => void;\n 99→ onResumeWorkflows?: () => void;\n 100→}\n 101→\n 102→export function ConversationList({\n 103→ conversations,\n 104→ selectedId,\n 105→ onSelect,\n 106→ selectedIds,\n 107→ onToggleSelection,\n 108→ onGroupConversations,\n 109→ onClearSelection,\n 110→ onSelectAll,\n 111→ onUngroupConversation,\n 112→ onDeleteConversation,\n 113→ onRename,\n 114→ onGenerateAnalysis,\n 115→ onGenerateSummary,\n 116→ onFilesSelected,\n 117→ onEditPrompt,\n 118→ onEditComponents,\n 119→ onEditSegmentationPrompt,\n 120→ onEditSummaryPrompt,\n 121→ onEditAnalysisPrompt,\n 122→ onEditColoringPrompt,\n 123→ onApplyPromptsToAll,\n 124→ onExportPromptsAsPreset,"
}
]
},
{
"id": "293",
"role": "assistant",
"timestamp": "2026-03-09T18:38:04.385Z",
"parts": [
{
"id": "292",
"type": "tool-call",
"token_count": 33,
"component": "understanding_codebase",
"toolCallId": "toolu_01JuJ6TZVHvRuWC3PzCUda9S",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationList.tsx",
"limit": 80,
"offset": 760
}
}
]
},
{
"id": "294",
"role": "tool",
"timestamp": "2026-03-09T18:38:04.433Z",
"parts": [
{
"id": "295",
"type": "tool-result",
"token_count": 1014,
"component": "understanding_codebase",
"toolCallId": "toolu_01JuJ6TZVHvRuWC3PzCUda9S",
"toolName": "Read",
"output": " 760→ ({timing}s)\n 761→ </span>\n 762→ )}\n 763→ </div>\n 764→ {/* Edit prompt link - show below \"Segment content\" step */}\n 765→ {isSegmentingStep &&\n 766→ onEditSegmentationPrompt && (\n 767→ <div className=\"flex gap-2 ml-5 mt-0.5\">\n 768→ <button\n 769→ onClick={(e) => {\n 770→ e.stopPropagation();\n 771→ onEditSegmentationPrompt(conversation.id);\n 772→ }}\n 773→ className=\"text-xs text-blue-600 hover:text-blue-700 hover:underline\"\n 774→ >\n 775→ Edit prompt\n 776→ </button>\n 777→ </div>\n 778→ )}\n 779→ {/* Edit prompt link - show below \"Generate summary\" step */}\n 780→ {isSummaryStep && onEditSummaryPrompt && (\n 781→ <div className=\"flex gap-2 ml-5 mt-0.5\">\n 782→ <button\n 783→ onClick={(e) => {\n 784→ e.stopPropagation();\n 785→ onEditSummaryPrompt(conversation.id);\n 786→ }}\n 787→ className=\"text-xs text-blue-600 hover:text-blue-700 hover:underline\"\n 788→ >\n 789→ Edit prompt\n 790→ </button>\n 791→ </div>\n 792→ )}\n 793→ {/* Edit prompt and Edit components links - show below \"Find components\" step */}\n 794→ {isFindComponentsStep &&\n 795→ (onEditPrompt || onEditComponents) && (\n 796→ <div className=\"flex gap-2 ml-5 mt-0.5\">\n 797→ {onEditPrompt && (\n 798→ <button\n 799→ onClick={(e) => {\n 800→ e.stopPropagation();\n 801→ onEditPrompt(conversation.id);\n 802→ }}\n 803→ className=\"text-xs text-blue-600 hover:text-blue-700 hover:underline\"\n 804→ >\n 805→ Edit prompt\n 806→ </button>\n 807→ )}\n 808→ {onEditComponents && (\n 809→ <button\n 810→ onClick={(e) => {\n 811→ e.stopPropagation();\n 812→ onEditComponents(conversation.id);\n 813→ }}\n 814→ className=\"text-xs text-blue-600 hover:text-blue-700 hover:underline\"\n 815→ >\n 816→ Edit components\n 817→ </button>\n 818→ )}\n 819→ </div>\n 820→ )}\n 821→ {/* Edit prompt link - show below \"Assign colors\" step */}\n 822→ {isColoringStep && onEditColoringPrompt && (\n 823→ <div className=\"flex gap-2 ml-5 mt-0.5\">\n 824→ <button\n 825→ onClick={(e) => {\n 826→ e.stopPropagation();\n 827→ onEditColoringPrompt(conversation.id);\n 828→ }}\n 829→ className=\"text-xs text-blue-600 hover:text-blue-700 hover:underline\"\n 830→ >\n 831→ Edit prompt\n 832→ </button>\n 833→ </div>\n 834→ )}\n 835→ {/* Edit prompt link - show below \"Generate analysis\" step */}\n 836→ {isAnalysisStep && onEditAnalysisPrompt && (\n 837→ <div className=\"flex gap-2 ml-5 mt-0.5\">\n 838→ <button\n 839→ onClick={(e) => {"
}
]
},
{
"id": "298",
"role": "assistant",
"timestamp": "2026-03-09T18:38:12.580Z",
"parts": [
{
"id": "296",
"type": "text",
"token_count": 119,
"component": "ui_changes",
"text": "Now I have a clear picture of everything. This is a large amount of code to change. Let me now focus on the most impactful UI changes: adding the dimension management and passing dimensions to views.\n\nThe approach for the UI:\n1. Add `activeDimensions` state in App.tsx\n2. Add dimension management handlers (add/remove/rename dimension, edit per-dimension prompt)\n3. Pass `dimensions` to ConversationView\n4. Add dimension selector dropdown in ComponentsView\n5. Update ComponentComparisonView\n\nLet me start with the App-level state and handlers for dimension management:"
},
{
"id": "297",
"type": "tool-call",
"token_count": 31,
"component": "ui_changes",
"toolCallId": "toolu_01LxhamppPpmFJSchNhSPBsM",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 20,
"offset": 1100
}
}
]
},
{
"id": "299",
"role": "tool",
"timestamp": "2026-03-09T18:38:13.201Z",
"parts": [
{
"id": "300",
"type": "tool-result",
"token_count": 299,
"component": "ui_changes",
"toolCallId": "toolu_01LxhamppPpmFJSchNhSPBsM",
"toolName": "Read",
"output": " 1100→ window.history.replaceState({}, \"\", basePath);\n 1101→ } else {\n 1102→ // Check if the conversation is grouped\n 1103→ const conv = conversations.find(c => c.id === id);\n 1104→ const isGrouped = conv?.isGrouped ?? false;\n 1105→ navigateToConversation(id, isGrouped);\n 1106→ }\n 1107→ }, [conversations, navigateToConversation]);\n 1108→\n 1109→ // Sidebar and insights panel collapse is managed via URL state above\n 1110→\n 1111→ // Prompt editor dialog state\n 1112→ const [isPromptDialogOpen, setIsPromptDialogOpen] = useState(false);\n 1113→ const [editingPrompt, setEditingPrompt] = useState(\n 1114→ getDefaultComponentIdentificationPrompt(),\n 1115→ );\n 1116→\n 1117→ // Components editor dialog state\n 1118→ const [isComponentsDialogOpen, setIsComponentsDialogOpen] = useState(false);\n 1119→ const [editingComponents, setEditingComponents] = useState(\"\");"
}
]
},
{
"id": "303",
"role": "assistant",
"timestamp": "2026-03-09T18:38:19.050Z",
"parts": [
{
"id": "301",
"type": "text",
"token_count": 23,
"component": "ui_changes",
"text": "I'll add the `activeDimensions` state and the `editingDimension` tracking state right after the prompt dialog states:"
},
{
"id": "302",
"type": "tool-call",
"token_count": 31,
"component": "ui_changes",
"toolCallId": "toolu_013Lfv4a4jX8RFSEy3j3YAfT",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 20,
"offset": 1147
}
}
]
},
{
"id": "304",
"role": "tool",
"timestamp": "2026-03-09T18:38:19.924Z",
"parts": [
{
"id": "305",
"type": "tool-result",
"token_count": 354,
"component": "ui_changes",
"toolCallId": "toolu_013Lfv4a4jX8RFSEy3j3YAfT",
"toolName": "Read",
"output": " 1147→ const [editingColoringPrompt, setEditingColoringPrompt] = useState(\n 1148→ getDefaultColoringPrompt(),\n 1149→ );\n 1150→\n 1151→ // Preset state\n 1152→ const [availablePresets, setAvailablePresets] = useState<PresetSummary[]>([]);\n 1153→ const [selectedPresetId, setSelectedPresetId] = useState<string | null>(null);\n 1154→ const [loadedPreset, setLoadedPreset] = useState<PresetConfig | null>(null);\n 1155→ const [isPresetLoading, setIsPresetLoading] = useState(false);\n 1156→ const [presetError, setPresetError] = useState<string | null>(null);\n 1157→\n 1158→ // URL auto-import state\n 1159→ const importInProgressRef = useRef(false);\n 1160→ const [importError, setImportError] = useState<string | null>(null);\n 1161→ const [isUrlImporting, setIsUrlImporting] = useState(false);\n 1162→\n 1163→ const fileIdsRef = useRef<Map<number, string>>(new Map());\n 1164→\n 1165→ // Pending groups from SessionExport import\n 1166→ // Maps old file IDs to file indices, plus the groups to recreate"
}
]
},
{
"id": "307",
"role": "assistant",
"timestamp": "2026-03-09T18:38:25.467Z",
"parts": [
{
"id": "306",
"type": "tool-call",
"token_count": 153,
"component": "workflow_refactor",
"toolCallId": "toolu_01BFdAJdUNBZcZBGPnxWDM1t",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " // Preset state\n const [availablePresets, setAvailablePresets] = useState<PresetSummary[]>([]);",
"new_string": " // Multi-dimension state\n const [activeDimensions, setActiveDimensions] = useState<Set<string>>(new Set([\"default\"]));\n const [editingDimensionName, setEditingDimensionName] = useState<string | null>(null); // Which dimension's prompt is being edited\n\n // Preset state\n const [availablePresets, setAvailablePresets] = useState<PresetSummary[]>([]);"
}
}
]
},
{
"id": "308",
"role": "tool",
"timestamp": "2026-03-09T18:38:25.522Z",
"parts": [
{
"id": "309",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01BFdAJdUNBZcZBGPnxWDM1t",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "312",
"role": "assistant",
"timestamp": "2026-03-09T18:38:29.451Z",
"parts": [
{
"id": "310",
"type": "text",
"token_count": 18,
"component": "workflow_refactor",
"text": "Now add dimension management handlers. Let me find a good place after the existing prompt handlers:"
},
{
"id": "311",
"type": "tool-call",
"token_count": 31,
"component": "workflow_refactor",
"toolCallId": "toolu_013ThBdD8MVFGtpNemgr3TrU",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 5,
"offset": 1716
}
}
]
},
{
"id": "313",
"role": "tool",
"timestamp": "2026-03-09T18:38:30.219Z",
"parts": [
{
"id": "314",
"type": "tool-result",
"token_count": 47,
"component": "workflow_refactor",
"toolCallId": "toolu_013ThBdD8MVFGtpNemgr3TrU",
"toolName": "Read",
"output": " 1716→ }\n 1717→ : conv,\n 1718→ ),\n 1719→ );\n 1720→ } finally {"
}
]
},
{
"id": "316",
"role": "assistant",
"timestamp": "2026-03-09T18:38:38.343Z",
"parts": [
{
"id": "315",
"type": "tool-call",
"token_count": 31,
"component": "workflow_refactor",
"toolCallId": "toolu_01CtAz2cQ6aaxcv38xEdAqy1",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 10,
"offset": 1720
}
}
]
},
{
"id": "317",
"role": "tool",
"timestamp": "2026-03-09T18:38:38.398Z",
"parts": [
{
"id": "318",
"type": "tool-result",
"token_count": 105,
"component": "workflow_refactor",
"toolCallId": "toolu_01CtAz2cQ6aaxcv38xEdAqy1",
"toolName": "Read",
"output": " 1720→ } finally {\n 1721→ setReprocessingId(null);\n 1722→ }\n 1723→ };\n 1724→\n 1725→ // Sidebar toggle handlers\n 1726→ const handleToggleSidebar = () => {\n 1727→ setSidebarCollapsed(!isSidebarCollapsed);\n 1728→ };\n 1729→"
}
]
},
{
"id": "321",
"role": "assistant",
"timestamp": "2026-03-09T18:38:42.408Z",
"parts": [
{
"id": "319",
"type": "text",
"token_count": 12,
"component": "workflow_refactor",
"text": "I'll add the dimension management handlers before the sidebar toggle handlers:"
},
{
"id": "320",
"type": "tool-call",
"token_count": 1423,
"component": "workflow_refactor",
"toolCallId": "toolu_01S6SyarGkbAiCcTjtoTC5ZV",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " // Sidebar toggle handlers\n const handleToggleSidebar = () => {\n setSidebarCollapsed(!isSidebarCollapsed);\n };",
"new_string": " // Dimension management handlers\n const handleAddDimension = async (name: string) => {\n if (!selectedConversation?.conversation) return;\n const id = selectedConversation.id;\n\n // Add empty dimension to state\n setConversations((prev) =>\n prev.map((conv) => {\n if (conv.id !== id) return conv;\n const dims = { ...(conv.dimensions || {}) };\n dims[name] = {\n name,\n components: [],\n componentMapping: {},\n componentTimeline: [],\n componentColors: {},\n };\n return { ...conv, dimensions: dims };\n }),\n );\n\n // Activate this dimension\n setActiveDimensions((prev) => new Set([...prev, name]));\n\n // Open prompt editor for this new dimension\n setEditingDimensionName(name);\n setEditingPrompt(getDefaultComponentIdentificationPrompt());\n setIsPromptDialogOpen(true);\n };\n\n const handleRemoveDimension = (name: string) => {\n if (name === \"default\") return; // Can't remove default\n if (!selectedConversation) return;\n const id = selectedConversation.id;\n\n setConversations((prev) =>\n prev.map((conv) => {\n if (conv.id !== id) return conv;\n const dims = { ...(conv.dimensions || {}) };\n delete dims[name];\n return { ...conv, dimensions: dims };\n }),\n );\n setActiveDimensions((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n };\n\n const handleRenameDimension = (oldName: string, newName: string) => {\n if (!selectedConversation) return;\n const id = selectedConversation.id;\n\n setConversations((prev) =>\n prev.map((conv) => {\n if (conv.id !== id) return conv;\n const dims = { ...(conv.dimensions || {}) };\n if (!dims[oldName]) return conv;\n dims[newName] = { ...dims[oldName]!, name: newName };\n delete dims[oldName];\n\n // Update legacy fields if renaming default\n const updates: Partial<WorkflowState> = { dimensions: dims };\n if (oldName === \"default\") {\n // The \"default\" key is special for legacy fields - keep synced\n }\n return { ...conv, ...updates };\n }),\n );\n setActiveDimensions((prev) => {\n const next = new Set(prev);\n if (next.has(oldName)) {\n next.delete(oldName);\n next.add(newName);\n }\n return next;\n });\n };\n\n const handleEditDimensionPrompt = (dimensionName: string) => {\n if (!selectedConversation) return;\n const dims = selectedConversation.dimensions;\n const dimData = dims?.[dimensionName];\n const currentPrompt = dimData?.prompt || getDefaultComponentIdentificationPrompt();\n\n setEditingDimensionName(dimensionName);\n setEditingPrompt(currentPrompt);\n setIsPromptDialogOpen(true);\n };\n\n // Override handleApplyPrompt to be dimension-aware\n const handleApplyDimensionPrompt = async () => {\n setIsPromptDialogOpen(false);\n if (!selectedConversation?.conversation) return;\n\n const dimName = editingDimensionName || \"default\";\n\n // Update the dimension's prompt in state\n setConversations((prev) =>\n prev.map((conv) => {\n if (conv.id !== selectedConversation.id) return conv;\n const dims = { ...(conv.dimensions || {}) };\n if (dims[dimName]) {\n dims[dimName] = { ...dims[dimName]!, prompt: editingPrompt };\n } else {\n dims[dimName] = {\n name: dimName,\n prompt: editingPrompt,\n components: [],\n componentMapping: {},\n componentTimeline: [],\n componentColors: {},\n };\n }\n return {\n ...conv,\n dimensions: dims,\n // Also update legacy customPrompt if editing default\n ...(dimName === \"default\" ? { customPrompt: editingPrompt } : {}),\n };\n }),\n );\n\n // Reprocess only this dimension\n const id = selectedConversation.id;\n setReprocessingId(id);\n try {\n const runner = new WorkflowRunner((id, update) => {\n setConversations((prev) =>\n prev.map((conv) => (conv.id === id ? { ...conv, ...update } : conv)),\n );\n });\n\n const conv = conversations.find((c) => c.id === id)!;\n const ctx = buildBaseContext(conv);\n\n // Set up dimension-specific processing\n const dims = ensureDimensions(ctx);\n if (!dims[dimName]) {\n dims[dimName] = {\n name: dimName,\n components: [],\n componentMapping: {},\n componentTimeline: [],\n componentColors: {},\n };\n }\n dims[dimName]!.prompt = editingPrompt;\n ctx.targetDimension = dimName;\n ctx.customPrompt = dimName === \"default\" ? editingPrompt : ctx.customPrompt;\n\n await processConversationWorkflow(\n WorkflowEvent.ComponentPromptChanged,\n ctx,\n runner,\n { onAnalysisChunk },\n );\n } catch (error) {\n console.error(\"Failed to reprocess dimension:\", error);\n } finally {\n setReprocessingId(null);\n }\n };\n\n // Sidebar toggle handlers\n const handleToggleSidebar = () => {\n setSidebarCollapsed(!isSidebarCollapsed);\n };"
}
}
]
},
{
"id": "322",
"role": "tool",
"timestamp": "2026-03-09T18:39:02.799Z",
"parts": [
{
"id": "323",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01S6SyarGkbAiCcTjtoTC5ZV",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "326",
"role": "assistant",
"timestamp": "2026-03-09T18:39:07.872Z",
"parts": [
{
"id": "324",
"type": "text",
"token_count": 29,
"component": "workflow_refactor",
"text": "Now I need to update the existing `handleOpenPromptEditor` and `handleApplyPrompt` to be dimension-aware. Let me find them:"
},
{
"id": "325",
"type": "tool-call",
"token_count": 43,
"component": "workflow_refactor",
"toolCallId": "toolu_01Dxr1i3w25QWDxqCFa2F67z",
"toolName": "Grep",
"input": {
"pattern": "handleOpenPromptEditor|handleApplyPrompt",
"path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "327",
"role": "tool",
"timestamp": "2026-03-09T18:39:08.923Z",
"parts": [
{
"id": "328",
"type": "tool-result",
"token_count": 115,
"component": "workflow_refactor",
"toolCallId": "toolu_01Dxr1i3w25QWDxqCFa2F67z",
"toolName": "Grep",
"output": "1555: const handleOpenPromptEditor = (id: string) => {\n1569: const handleApplyPrompt = async () => {\n1816: // Override handleApplyPrompt to be dimension-aware\n1951: const handleApplyPromptsToAll = async (sourceId: string) => {\n3122: onEditPrompt={handleOpenPromptEditor}\n3128: onApplyPromptsToAll={handleApplyPromptsToAll}\n3289: onApply={handleApplyPrompt}"
}
]
},
{
"id": "330",
"role": "assistant",
"timestamp": "2026-03-09T18:39:12.464Z",
"parts": [
{
"id": "329",
"type": "tool-call",
"token_count": 31,
"component": "workflow_refactor",
"toolCallId": "toolu_0113bzXZYuzZVL4u9jN9ADmy",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 25,
"offset": 1555
}
}
]
},
{
"id": "331",
"role": "tool",
"timestamp": "2026-03-09T18:39:12.505Z",
"parts": [
{
"id": "332",
"type": "tool-result",
"token_count": 357,
"component": "workflow_refactor",
"toolCallId": "toolu_0113bzXZYuzZVL4u9jN9ADmy",
"toolName": "Read",
"output": " 1555→ const handleOpenPromptEditor = (id: string) => {\n 1556→ // Select the conversation so the apply handler targets it\n 1557→ setSelectedId(id);\n 1558→ const conv = conversations.find((c) => c.id === id);\n 1559→ // Get the prompt: conversation custom > preset > default\n 1560→ const currentPrompt =\n 1561→ conv?.customPrompt ||\n 1562→ loadedPreset?.componentIdentificationPrompt ||\n 1563→ getDefaultComponentIdentificationPrompt();\n 1564→ setEditingPrompt(currentPrompt);\n 1565→ setIsPromptDialogOpen(true);\n 1566→ };\n 1567→\n 1568→ // Handle applying the edited prompt\n 1569→ const handleApplyPrompt = async () => {\n 1570→ setIsPromptDialogOpen(false);\n 1571→ if (selectedConversation && selectedConversation.conversation) {\n 1572→ await handleReprocessComponents({ customPrompt: editingPrompt });\n 1573→ }\n 1574→ };\n 1575→\n 1576→ // Handle opening the components editor\n 1577→ const handleOpenComponentsEditor = (id: string) => {\n 1578→ setSelectedId(id);\n 1579→ const conv = conversations.find((c) => c.id === id);"
}
]
},
{
"id": "335",
"role": "assistant",
"timestamp": "2026-03-09T18:39:17.873Z",
"parts": [
{
"id": "333",
"type": "text",
"token_count": 28,
"component": "workflow_refactor",
"text": "I'll update `handleOpenPromptEditor` to set the default dimension, and update `handleApplyPrompt` to use the dimension-aware version:"
},
{
"id": "334",
"type": "tool-call",
"token_count": 421,
"component": "workflow_refactor",
"toolCallId": "toolu_01VHGGjPwJ7ZHxt5mSy5oBXy",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " const handleOpenPromptEditor = (id: string) => {\n // Select the conversation so the apply handler targets it\n setSelectedId(id);\n const conv = conversations.find((c) => c.id === id);\n // Get the prompt: conversation custom > preset > default\n const currentPrompt =\n conv?.customPrompt ||\n loadedPreset?.componentIdentificationPrompt ||\n getDefaultComponentIdentificationPrompt();\n setEditingPrompt(currentPrompt);\n setIsPromptDialogOpen(true);\n };\n\n // Handle applying the edited prompt\n const handleApplyPrompt = async () => {\n setIsPromptDialogOpen(false);\n if (selectedConversation && selectedConversation.conversation) {\n await handleReprocessComponents({ customPrompt: editingPrompt });\n }\n };",
"new_string": " const handleOpenPromptEditor = (id: string, dimensionName?: string) => {\n // Select the conversation so the apply handler targets it\n setSelectedId(id);\n const conv = conversations.find((c) => c.id === id);\n const dimName = dimensionName || \"default\";\n setEditingDimensionName(dimName);\n\n // Get the prompt: dimension-specific > conversation custom > preset > default\n const dimPrompt = conv?.dimensions?.[dimName]?.prompt;\n const currentPrompt =\n dimPrompt ||\n conv?.customPrompt ||\n loadedPreset?.componentIdentificationPrompt ||\n getDefaultComponentIdentificationPrompt();\n setEditingPrompt(currentPrompt);\n setIsPromptDialogOpen(true);\n };\n\n // Handle applying the edited prompt (dimension-aware)\n const handleApplyPrompt = async () => {\n await handleApplyDimensionPrompt();\n };"
}
}
]
},
{
"id": "336",
"role": "tool",
"timestamp": "2026-03-09T18:39:22.099Z",
"parts": [
{
"id": "337",
"type": "tool-result",
"token_count": 24,
"component": "workflow_refactor",
"toolCallId": "toolu_01VHGGjPwJ7ZHxt5mSy5oBXy",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "340",
"role": "assistant",
"timestamp": "2026-03-09T18:39:27.448Z",
"parts": [
{
"id": "338",
"type": "text",
"token_count": 39,
"component": "ui_changes",
"text": "### Step 9: Pass dimensions and dimension management to ConversationView\n\nNow I need to update the `ConversationView` to accept and pass through dimensions. Let me update the props being passed:"
},
{
"id": "339",
"type": "tool-call",
"token_count": 31,
"component": "ui_changes",
"toolCallId": "toolu_01SXT17dZ3Wk8jEJBteYhH3z",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 40,
"offset": 3143
}
}
]
},
{
"id": "341",
"role": "tool",
"timestamp": "2026-03-09T18:39:28.392Z",
"parts": [
{
"id": "342",
"type": "tool-result",
"token_count": 619,
"component": "ui_changes",
"toolCallId": "toolu_01SXT17dZ3Wk8jEJBteYhH3z",
"toolName": "Read",
"output": " 3143→ <main>\n 3144→ {selectedConversation ? (\n 3145→ selectedConversation.conversation ? (\n 3146→ // Show conversation as soon as it's available (even if still processing tokens/summary)\n 3147→ <ConversationView\n 3148→ conversation={selectedConversation.conversation}\n 3149→ componentMapping={selectedConversation.componentMapping}\n 3150→ componentTimeline={selectedConversation.componentTimeline}\n 3151→ componentColors={selectedConversation.componentColors}\n 3152→ components={selectedConversation.components}\n 3153→ staticMapping={selectedConversation.staticMapping}\n 3154→ staticTimeline={selectedConversation.staticTimeline}\n 3155→ warnings={selectedConversation.warnings}\n 3156→ onReprocessComponents={handleReprocessComponents}\n 3157→ isReprocessing={reprocessingId === selectedConversation.id}\n 3158→ messageSourceMap={selectedConversation.messageSourceMap}\n 3159→ isGrouped={selectedConversation.isGrouped}\n 3160→ groupTitle={selectedConversation.title}\n 3161→ onConversationClick={setSelectedId}\n 3162→ sourceConversationComponents={sourceConversationComponents}\n 3163→ sourceWorkflowStates={sourceWorkflowStates}\n 3164→ // URL-controlled state\n 3165→ activeTab={urlState.tab as TabType}\n 3166→ onTabChange={(tab) => navigateToTab(tab)}\n 3167→ searchQuery={urlState.searchQuery}\n 3168→ onSearchQueryChange={setSearchQuery}\n 3169→ sortBy={urlState.sort as SortOption}\n 3170→ onSortByChange={setSort}\n 3171→ messageFilters={urlState.messageFilters}\n 3172→ onMessageFiltersChange={setMessageFilters}\n 3173→ selectedComponents={urlState.componentFilters}\n 3174→ onSelectedComponentsChange={setComponentFilters}\n 3175→ // Comparison tab state\n 3176→ comparisonViewMode={urlState.comparisonView}\n 3177→ onComparisonViewModeChange={setComparisonView}\n 3178→ comparisonLegendMode={urlState.comparisonLegend}\n 3179→ onComparisonLegendModeChange={setComparisonLegend}\n 3180→ comparisonSortField={urlState.comparisonSortBy}\n 3181→ onComparisonSortFieldChange={setComparisonSortBy}\n 3182→ comparisonSortDirection={urlState.comparisonSortDir}"
}
]
},
{
"id": "344",
"role": "assistant",
"timestamp": "2026-03-09T18:39:35.125Z",
"parts": [
{
"id": "343",
"type": "tool-call",
"token_count": 165,
"component": "ui_changes",
"toolCallId": "toolu_01HYmUzoyEe9QGcs7eF12QJ7",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " <ConversationView\n conversation={selectedConversation.conversation}\n componentMapping={selectedConversation.componentMapping}\n componentTimeline={selectedConversation.componentTimeline}\n componentColors={selectedConversation.componentColors}\n components={selectedConversation.components}",
"new_string": " <ConversationView\n conversation={selectedConversation.conversation}\n componentMapping={selectedConversation.componentMapping}\n componentTimeline={selectedConversation.componentTimeline}\n componentColors={selectedConversation.componentColors}\n components={selectedConversation.components}\n dimensions={selectedConversation.dimensions}\n activeDimensions={activeDimensions}\n onActiveDimensionsChange={setActiveDimensions}"
}
}
]
},
{
"id": "345",
"role": "tool",
"timestamp": "2026-03-09T18:39:35.178Z",
"parts": [
{
"id": "346",
"type": "tool-result",
"token_count": 24,
"component": "ui_changes",
"toolCallId": "toolu_01HYmUzoyEe9QGcs7eF12QJ7",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "349",
"role": "assistant",
"timestamp": "2026-03-09T18:39:39.483Z",
"parts": [
{
"id": "347",
"type": "text",
"token_count": 21,
"component": "ui_changes",
"text": "Now update ConversationView to accept and pass through the new props. Let me also add dimension management props:"
},
{
"id": "348",
"type": "tool-call",
"token_count": 125,
"component": "ui_changes",
"toolCallId": "toolu_018oDiYeDNZi4AG5w6BAVE95",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " sourceConversationComponents={sourceConversationComponents}\n sourceWorkflowStates={sourceWorkflowStates}",
"new_string": " sourceConversationComponents={sourceConversationComponents}\n sourceWorkflowStates={sourceWorkflowStates}\n onAddDimension={handleAddDimension}\n onRemoveDimension={handleRemoveDimension}\n onRenameDimension={handleRenameDimension}\n onEditDimensionPrompt={(dimName) => handleOpenPromptEditor(selectedConversation.id, dimName)}"
}
}
]
},
{
"id": "350",
"role": "tool",
"timestamp": "2026-03-09T18:39:41.809Z",
"parts": [
{
"id": "351",
"type": "tool-result",
"token_count": 24,
"component": "ui_changes",
"toolCallId": "toolu_018oDiYeDNZi4AG5w6BAVE95",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "354",
"role": "assistant",
"timestamp": "2026-03-09T18:39:46.625Z",
"parts": [
{
"id": "352",
"type": "text",
"token_count": 13,
"component": "ui_changes",
"text": "### Step 10: Update ConversationView props and pass dimensions down"
},
{
"id": "353",
"type": "tool-call",
"token_count": 33,
"component": "ui_changes",
"toolCallId": "toolu_01JoP8QcxG8FiUDq9ZHUJM9e",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"limit": 10,
"offset": 27
}
}
]
},
{
"id": "355",
"role": "tool",
"timestamp": "2026-03-09T18:39:47.124Z",
"parts": [
{
"id": "356",
"type": "tool-result",
"token_count": 143,
"component": "ui_changes",
"toolCallId": "toolu_01JoP8QcxG8FiUDq9ZHUJM9e",
"toolName": "Read",
"output": " 27→import { getStaticComponentLabel } from \"@/lib/static-component-colors\";\n 28→import type { Conversation, Message, SourceInfo } from \"@/schema\";\n 29→import type { ComponentTimelineSnapshot } from \"@/componentisation\";\n 30→import {\n 31→ type MessageFilter,\n 32→ type SortOption as UrlSortOption,\n 33→ type ConversationTab,\n 34→ type GroupTab,\n 35→ ALL_MESSAGE_FILTERS,\n 36→} from \"@/lib/url-state\";"
}
]
},
{
"id": "358",
"role": "assistant",
"timestamp": "2026-03-09T18:39:51.880Z",
"parts": [
{
"id": "357",
"type": "tool-call",
"token_count": 107,
"component": "ui_changes",
"toolCallId": "toolu_01DGpUSDPQYkdBNSC82EVhPu",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"old_string": "import type { Conversation, Message, SourceInfo } from \"@/schema\";\nimport type { ComponentTimelineSnapshot } from \"@/componentisation\";",
"new_string": "import type { Conversation, Message, SourceInfo } from \"@/schema\";\nimport type { ComponentTimelineSnapshot, DimensionData } from \"@/componentisation\";"
}
}
]
},
{
"id": "359",
"role": "tool",
"timestamp": "2026-03-09T18:39:51.944Z",
"parts": [
{
"id": "360",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01DGpUSDPQYkdBNSC82EVhPu",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx has been updated successfully."
}
]
},
{
"id": "363",
"role": "assistant",
"timestamp": "2026-03-09T18:39:55.833Z",
"parts": [
{
"id": "361",
"type": "text",
"token_count": 9,
"component": "ui_changes",
"text": "Now add the new props to the interface:"
},
{
"id": "362",
"type": "tool-call",
"token_count": 572,
"component": "ui_changes",
"toolCallId": "toolu_01UiHDTLNCDSRf9vKB4mt8ey",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"old_string": "interface ConversationViewProps {\n conversation: Conversation;\n componentMapping?: Record<string, string>;\n componentTimeline?: ComponentTimelineSnapshot[];\n componentColors?: Record<string, string>;\n components?: string[];\n // Static componentisation (deterministic, no AI)\n staticMapping?: Record<string, string>;\n staticTimeline?: ComponentTimelineSnapshot[];\n warnings?: string[];\n onReprocessComponents?: (options?: { customPrompt?: string; customComponents?: string[] }) => Promise<void>;\n isReprocessing?: boolean;\n // Grouped conversation data\n messageSourceMap?: Record<string, SourceInfo>;\n isGrouped?: boolean;\n groupTitle?: string;\n onConversationClick?: (id: string) => void;\n sourceConversationComponents?: ConversationComponentData[];\n // Source workflow states for grouped conversations (for filtered comparison)\n sourceWorkflowStates?: SourceWorkflowState[];",
"new_string": "interface ConversationViewProps {\n conversation: Conversation;\n componentMapping?: Record<string, string>;\n componentTimeline?: ComponentTimelineSnapshot[];\n componentColors?: Record<string, string>;\n components?: string[];\n // Multi-dimensional component data\n dimensions?: Record<string, DimensionData>;\n activeDimensions?: Set<string>;\n onActiveDimensionsChange?: (dims: Set<string>) => void;\n // Dimension management\n onAddDimension?: (name: string) => void;\n onRemoveDimension?: (name: string) => void;\n onRenameDimension?: (oldName: string, newName: string) => void;\n onEditDimensionPrompt?: (dimensionName: string) => void;\n // Static componentisation (deterministic, no AI)\n staticMapping?: Record<string, string>;\n staticTimeline?: ComponentTimelineSnapshot[];\n warnings?: string[];\n onReprocessComponents?: (options?: { customPrompt?: string; customComponents?: string[] }) => Promise<void>;\n isReprocessing?: boolean;\n // Grouped conversation data\n messageSourceMap?: Record<string, SourceInfo>;\n isGrouped?: boolean;\n groupTitle?: string;\n onConversationClick?: (id: string) => void;\n sourceConversationComponents?: ConversationComponentData[];\n // Source workflow states for grouped conversations (for filtered comparison)\n sourceWorkflowStates?: SourceWorkflowState[];"
}
}
]
},
{
"id": "364",
"role": "tool",
"timestamp": "2026-03-09T18:40:02.694Z",
"parts": [
{
"id": "365",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01UiHDTLNCDSRf9vKB4mt8ey",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx has been updated successfully."
}
]
},
{
"id": "368",
"role": "assistant",
"timestamp": "2026-03-09T18:40:05.472Z",
"parts": [
{
"id": "366",
"type": "text",
"token_count": 11,
"component": "ui_changes",
"text": "Now destructure the new props in the component function:"
},
{
"id": "367",
"type": "tool-call",
"token_count": 42,
"component": "ui_changes",
"toolCallId": "toolu_019aPKtR64fPqN1MM96UWMXz",
"toolName": "Grep",
"input": {
"pattern": "export function ConversationView",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "369",
"role": "tool",
"timestamp": "2026-03-09T18:40:06.770Z",
"parts": [
{
"id": "370",
"type": "tool-result",
"token_count": 10,
"component": "ui_changes",
"toolCallId": "toolu_019aPKtR64fPqN1MM96UWMXz",
"toolName": "Grep",
"output": "113:export function ConversationView({"
}
]
},
{
"id": "372",
"role": "assistant",
"timestamp": "2026-03-09T18:40:11.897Z",
"parts": [
{
"id": "371",
"type": "tool-call",
"token_count": 33,
"component": "ui_changes",
"toolCallId": "toolu_01WEToXMiuvir1EbcKXcW3Z2",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"limit": 40,
"offset": 113
}
}
]
},
{
"id": "373",
"role": "tool",
"timestamp": "2026-03-09T18:40:11.938Z",
"parts": [
{
"id": "374",
"type": "tool-result",
"token_count": 421,
"component": "ui_changes",
"toolCallId": "toolu_01WEToXMiuvir1EbcKXcW3Z2",
"toolName": "Read",
"output": " 113→export function ConversationView({\n 114→ conversation,\n 115→ componentMapping,\n 116→ componentTimeline,\n 117→ componentColors,\n 118→ components,\n 119→ staticMapping,\n 120→ staticTimeline,\n 121→ warnings,\n 122→ onReprocessComponents,\n 123→ isReprocessing,\n 124→ messageSourceMap,\n 125→ isGrouped,\n 126→ groupTitle,\n 127→ onConversationClick,\n 128→ sourceConversationComponents,\n 129→ sourceWorkflowStates,\n 130→ // URL-controlled state\n 131→ activeTab: controlledActiveTab,\n 132→ onTabChange,\n 133→ searchQuery: controlledSearchQuery,\n 134→ onSearchQueryChange,\n 135→ sortBy: controlledSortBy,\n 136→ onSortByChange,\n 137→ messageFilters: controlledMessageFilters,\n 138→ onMessageFiltersChange,\n 139→ selectedComponents: controlledSelectedComponents,\n 140→ onSelectedComponentsChange,\n 141→ // Comparison tab controlled state\n 142→ comparisonViewMode,\n 143→ onComparisonViewModeChange,\n 144→ comparisonLegendMode,\n 145→ onComparisonLegendModeChange,\n 146→ comparisonSortField,\n 147→ onComparisonSortFieldChange,\n 148→ comparisonSortDirection,\n 149→ onComparisonSortDirectionChange,\n 150→ comparisonColumnCount,\n 151→ onComparisonColumnCountChange,\n 152→ comparisonSquaresPerRow,"
}
]
},
{
"id": "376",
"role": "assistant",
"timestamp": "2026-03-09T18:40:17.443Z",
"parts": [
{
"id": "375",
"type": "tool-call",
"token_count": 157,
"component": "ui_changes",
"toolCallId": "toolu_01TtRHntCVeEzFZsxVUEgAEM",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"old_string": "export function ConversationView({\n conversation,\n componentMapping,\n componentTimeline,\n componentColors,\n components,\n staticMapping,\n staticTimeline,",
"new_string": "export function ConversationView({\n conversation,\n componentMapping,\n componentTimeline,\n componentColors,\n components,\n dimensions,\n activeDimensions,\n onActiveDimensionsChange,\n onAddDimension,\n onRemoveDimension,\n onRenameDimension,\n onEditDimensionPrompt,\n staticMapping,\n staticTimeline,"
}
}
]
},
{
"id": "377",
"role": "tool",
"timestamp": "2026-03-09T18:40:17.496Z",
"parts": [
{
"id": "378",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01TtRHntCVeEzFZsxVUEgAEM",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx has been updated successfully."
}
]
},
{
"id": "381",
"role": "assistant",
"timestamp": "2026-03-09T18:40:21.383Z",
"parts": [
{
"id": "379",
"type": "text",
"token_count": 21,
"component": "ui_changes",
"text": "Now I need to find where `ComponentsView` is rendered in ConversationView and pass the new props:"
},
{
"id": "380",
"type": "tool-call",
"token_count": 41,
"component": "ui_changes",
"toolCallId": "toolu_01RW6RgK29ENKvuBRB82itUq",
"toolName": "Grep",
"input": {
"pattern": "<ComponentsView",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "382",
"role": "tool",
"timestamp": "2026-03-09T18:40:22.308Z",
"parts": [
{
"id": "383",
"type": "tool-result",
"token_count": 11,
"component": "ui_changes",
"toolCallId": "toolu_01RW6RgK29ENKvuBRB82itUq",
"toolName": "Grep",
"output": "1099: <ComponentsView"
}
]
},
{
"id": "385",
"role": "assistant",
"timestamp": "2026-03-09T18:40:27.173Z",
"parts": [
{
"id": "384",
"type": "tool-call",
"token_count": 34,
"component": "ui_changes",
"toolCallId": "toolu_01GXN44fFjoCQmVxByFDqdSx",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"limit": 20,
"offset": 1099
}
}
]
},
{
"id": "386",
"role": "tool",
"timestamp": "2026-03-09T18:40:27.228Z",
"parts": [
{
"id": "387",
"type": "tool-result",
"token_count": 271,
"component": "ui_changes",
"toolCallId": "toolu_01GXN44fFjoCQmVxByFDqdSx",
"toolName": "Read",
"output": " 1099→ <ComponentsView\n 1100→ componentMapping={componentMapping}\n 1101→ conversation={conversation}\n 1102→ componentTimeline={componentTimeline}\n 1103→ componentColors={componentColors}\n 1104→ selectedComponent={selectedAutoComponent}\n 1105→ onComponentSelect={(comp) => {\n 1106→ setSelectedAutoComponent(comp);\n 1107→ }}\n 1108→ staticMapping={staticMapping}\n 1109→ filterByStaticComponent={selectedStaticComponent}\n 1110→ messageTypeFilters={messageFiltersSet}\n 1111→ />\n 1112→ </div>\n 1113→\n 1114→ {/* Shared Message Parts Section */}\n 1115→ {selectedAutoComponent ? (\n 1116→ <div className=\"border rounded-lg bg-white\">\n 1117→ <div className=\"border-b px-4 py-3 flex items-center justify-between\">\n 1118→ <h3 className=\"text-sm font-semibold\">"
}
]
},
{
"id": "389",
"role": "assistant",
"timestamp": "2026-03-09T18:40:33.222Z",
"parts": [
{
"id": "388",
"type": "tool-call",
"token_count": 300,
"component": "ui_changes",
"toolCallId": "toolu_01X1MgS1YFctax4C6aGABBHQ",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"old_string": " <ComponentsView\n componentMapping={componentMapping}\n conversation={conversation}\n componentTimeline={componentTimeline}\n componentColors={componentColors}\n selectedComponent={selectedAutoComponent}\n onComponentSelect={(comp) => {\n setSelectedAutoComponent(comp);\n }}\n staticMapping={staticMapping}\n filterByStaticComponent={selectedStaticComponent}\n messageTypeFilters={messageFiltersSet}\n />",
"new_string": " <ComponentsView\n componentMapping={componentMapping}\n conversation={conversation}\n componentTimeline={componentTimeline}\n componentColors={componentColors}\n dimensions={dimensions}\n activeDimensions={activeDimensions}\n onActiveDimensionsChange={onActiveDimensionsChange}\n onAddDimension={onAddDimension}\n onRemoveDimension={onRemoveDimension}\n onRenameDimension={onRenameDimension}\n onEditDimensionPrompt={onEditDimensionPrompt}\n selectedComponent={selectedAutoComponent}\n onComponentSelect={(comp) => {\n setSelectedAutoComponent(comp);\n }}\n staticMapping={staticMapping}\n filterByStaticComponent={selectedStaticComponent}\n messageTypeFilters={messageFiltersSet}\n />"
}
}
]
},
{
"id": "390",
"role": "tool",
"timestamp": "2026-03-09T18:40:33.280Z",
"parts": [
{
"id": "391",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01X1MgS1YFctax4C6aGABBHQ",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx has been updated successfully."
}
]
},
{
"id": "394",
"role": "assistant",
"timestamp": "2026-03-09T18:40:37.840Z",
"parts": [
{
"id": "392",
"type": "text",
"token_count": 31,
"component": "ui_changes",
"text": "### Step 11: Update ComponentsView with dimension selector and management UI\n\nNow the key UI work - adding the dimension selector and accordion to ComponentsView:"
},
{
"id": "393",
"type": "tool-call",
"token_count": 25,
"component": "ui_changes",
"toolCallId": "toolu_01TkeZbQm6M4DwBFpe1c3oc1",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ComponentsView.tsx"
}
}
]
},
{
"id": "395",
"role": "tool",
"timestamp": "2026-03-09T18:40:38.207Z",
"parts": [
{
"id": "396",
"type": "tool-result",
"token_count": 2930,
"component": "ui_changes",
"toolCallId": "toolu_01TkeZbQm6M4DwBFpe1c3oc1",
"toolName": "Read",
"output": " 1→import { useState, useMemo } from \"react\";\n 2→import { Slider } from \"@/components/ui/slider\";\n 3→import { WaffleChart } from \"./WaffleChart\";\n 4→import { CompactLegend } from \"./ComponentComparisonView\";\n 5→import { cn } from \"@/lib/utils\";\n 6→import { getComponentWaffleStyles } from \"@/lib/component-colors\";\n 7→import { getStaticComponentLabel } from \"@/lib/static-component-colors\";\n 8→import type { Conversation } from \"@/schema\";\n 9→import type { ComponentTimelineSnapshot } from \"@/componentisation\";\n 10→\n 11→// Message type filter in format \"role:type\" (e.g., \"assistant:tool-call\")\n 12→type MessageTypeFilter = string;\n 13→\n 14→interface ComponentsViewProps {\n 15→ componentMapping?: Record<string, string>;\n 16→ conversation: Conversation;\n 17→ componentTimeline?: ComponentTimelineSnapshot[];\n 18→ componentColors?: Record<string, string>;\n 19→ selectedComponent?: string | null;\n 20→ onComponentSelect?: (component: string | null) => void;\n 21→ // Static component filter - when set, only show automatic components for parts matching this static component\n 22→ staticMapping?: Record<string, string>;\n 23→ filterByStaticComponent?: string | null;\n 24→ // Filters from conversation view\n 25→ messageTypeFilters?: Set<MessageTypeFilter>;\n 26→}\n 27→\n 28→export function ComponentsView({\n 29→ componentMapping,\n 30→ conversation,\n 31→ componentTimeline,\n 32→ componentColors,\n 33→ selectedComponent,\n 34→ onComponentSelect,\n 35→ staticMapping,\n 36→ filterByStaticComponent,\n 37→ messageTypeFilters,\n 38→}: ComponentsViewProps) {\n 39→ // Initialize slider to the last message\n 40→ const [currentMessageIndex, setCurrentMessageIndex] = useState(\n 41→ conversation.messages.length - 1\n 42→ );\n 43→\n 44→ // Helper to check if a part passes the message type filter\n 45→ const partPassesMessageTypeFilter = (part: { type: string }, msgRole: string): boolean => {\n 46→ if (!messageTypeFilters || messageTypeFilters.has(\"all\")) return true;\n 47→ const filterKey = `${msgRole}:${part.type}`;\n 48→ return messageTypeFilters.has(filterKey);\n 49→ };\n 50→\n 51→ // Get the set of part IDs that match the static component filter\n 52→ const filteredPartIds = useMemo(() => {\n 53→ if (!filterByStaticComponent || !staticMapping) return null;\n 54→\n 55→ const ids = new Set<string>();\n 56→ for (const [partId, staticComp] of Object.entries(staticMapping)) {\n 57→ if (staticComp === filterByStaticComponent) {\n 58→ ids.add(partId);\n 59→ }\n 60→ }\n 61→ return ids;\n 62→ }, [filterByStaticComponent, staticMapping]);\n 63→\n 64→ // Compute messageComponents for workflow view (filtered, up to current slider position)\n 65→ // Must be before early return to follow React hooks rules\n 66→ const messageComponents = useMemo(() => {\n 67→ if (!componentMapping) return [];\n 68→ const components: string[] = [];\n 69→ conversation.messages.forEach((message, msgIndex) => {\n 70→ if (msgIndex <= currentMessageIndex) {\n 71→ // Find the primary component for this message from first matching part\n 72→ let messageComponent: string | null = null;\n 73→ for (const part of message.parts) {\n 74→ // Apply message type filter\n 75→ if (!partPassesMessageTypeFilter(part, message.role)) continue;\n 76→\n 77→ // Apply static component filter if set\n 78→ if (filteredPartIds && !filteredPartIds.has(part.id)) continue;\n 79→\n 80→ const component = componentMapping[part.id];\n 81→ if (component) {\n 82→ messageComponent = component;\n 83→ break;\n 84→ }\n 85→ }\n 86→ // Only include message if it has parts that pass filters\n 87→ if (messageComponent !== null) {\n 88→ components.push(messageComponent);\n 89→ }\n 90→ }\n 91→ });\n 92→ return components;\n 93→ }, [conversation.messages, currentMessageIndex, componentMapping, filteredPartIds, messageTypeFilters]);\n 94→\n 95→ if (!componentMapping || Object.keys(componentMapping).length === 0) {\n 96→ return (\n 97→ <div className=\"p-8 text-center text-muted-foreground\">\n 98→ <p>No component mapping available yet.</p>\n 99→ <p className=\"text-sm mt-2\">\n 100→ Component mapping will appear here after processing.\n 101→ </p>\n 102→ </div>\n 103→ );\n 104→ }\n 105→\n 106→ // Get component data for the current message, filtered by static component and message type\n 107→ let componentTokensForOverview: Record<string, number> = {};\n 108→ let filteredTokensTotal = 0;\n 109→ let fullTokensTotal = 0;\n 110→\n 111→ // Always calculate from conversation to apply filtering\n 112→ conversation.messages.forEach((message, msgIndex) => {\n 113→ if (msgIndex <= currentMessageIndex) {\n 114→ message.parts.forEach((part) => {\n 115→ const component = componentMapping[part.id];\n 116→ if (component) {\n 117→ const tokenCount = (\"token_count\" in part && part.token_count) || 0;\n 118→ fullTokensTotal += tokenCount;\n 119→\n 120→ // Apply message type filter first\n 121→ if (!partPassesMessageTypeFilter(part, message.role)) return;\n 122→\n 123→ // Apply static component filter if set\n 124→ if (!filteredPartIds || filteredPartIds.has(part.id)) {\n 125→ componentTokensForOverview[component] =\n 126→ (componentTokensForOverview[component] || 0) + tokenCount;\n 127→ filteredTokensTotal += tokenCount;\n 128→ }\n 129→ }\n 130→ });\n 131→ }\n 132→ });\n 133→\n 134→ const handleComponentClick = (component: string) => {\n 135→ const newSelection = selectedComponent === component ? null : component;\n 136→ onComponentSelect?.(newSelection);\n 137→ };\n 138→\n 139→ // Check if message type filters are active\n 140→ const hasMessageTypeFilters = messageTypeFilters && !messageTypeFilters.has(\"all\") && messageTypeFilters.size > 0;\n 141→\n 142→ return (\n 143→ <div className=\"p-4\">\n 144→ {/* Filter indicator */}\n 145→ {(filterByStaticComponent || hasMessageTypeFilters) && (\n 146→ <div className=\"mb-3 text-sm text-blue-600 bg-blue-50 px-3 py-1.5 rounded-md\">\n 147→ {hasMessageTypeFilters && \"Filtered view\"}\n 148→ {hasMessageTypeFilters && filterByStaticComponent && \" · \"}\n 149→ {filterByStaticComponent && (\n 150→ <>Filtering by <strong>{getStaticComponentLabel(filterByStaticComponent)}</strong></>\n 151→ )}\n 152→ {\" · \"}{filteredTokensTotal.toLocaleString()} tokens\n 153→ </div>\n 154→ )}\n 155→\n 156→ {/* Timeline Slider */}\n 157→ <div className=\"mb-4 px-2\">\n 158→ <div className=\"flex items-center justify-between mb-2\">\n 159→ <span className=\"text-sm font-medium text-muted-foreground\">\n 160→ Message {currentMessageIndex + 1} of {conversation.messages.length}\n 161→ </span>\n 162→ <span className=\"text-sm font-semibold text-foreground\">\n 163→ {fullTokensTotal.toLocaleString()} tokens\n 164→ </span>\n 165→ </div>\n 166→ <Slider\n 167→ value={[currentMessageIndex]}\n 168→ onValueChange={(value) => setCurrentMessageIndex(value[0] ?? 0)}\n 169→ min={0}\n 170→ max={conversation.messages.length - 1}\n 171→ step={1}\n 172→ className=\"w-full\"\n 173→ />\n 174→ </div>\n 175→\n 176→ {/* Waffle Chart */}\n 177→ <WaffleChart\n 178→ componentTokens={componentTokensForOverview}\n 179→ totalTokens={filteredTokensTotal}\n 180→ getColorStyles={(component) => getComponentWaffleStyles(component, componentColors)}\n 181→ getLabel={(component) => component}\n 182→ onComponentClick={handleComponentClick}\n 183→ />\n 184→\n 185→ {/* Workflow Diagram - horizontal sequence of messages */}\n 186→ {messageComponents.length > 0 && (\n 187→ <div className=\"mt-6 pt-4 border-t\">\n 188→ <h4 className=\"text-sm font-medium text-muted-foreground mb-3\">\n 189→ Workflow ({messageComponents.length} messages)\n 190→ </h4>\n 191→ <div className=\"flex flex-wrap gap-0.5\">\n 192→ {messageComponents.map((component, index) => {\n 193→ const colorStyles = component ? getComponentWaffleStyles(component, componentColors) : null;\n 194→ return (\n 195→ <div\n 196→ key={index}\n 197→ className={cn(\n 198→ \"w-3 h-3 flex-shrink-0\",\n 199→ component ? colorStyles?.classes : \"bg-gray-200\",\n 200→ )}\n 201→ style={colorStyles?.style || undefined}\n 202→ title={`${index + 1}: ${component || \"unknown\"}`}\n 203→ />\n 204→ );\n 205→ })}\n 206→ </div>\n 207→ <div className=\"mt-3\">\n 208→ <CompactLegend\n 209→ components={messageComponents}\n 210→ componentColors={componentColors}\n 211→ />\n 212→ </div>\n 213→ </div>\n 214→ )}\n 215→ </div>\n 216→ );\n 217→}\n 218→"
}
]
},
{
"id": "399",
"role": "assistant",
"timestamp": "2026-03-09T18:40:42.669Z",
"parts": [
{
"id": "397",
"type": "text",
"token_count": 13,
"component": "ui_changes",
"text": "Now I'll update ComponentsView to add the dimension selector and accordion:"
},
{
"id": "398",
"type": "tool-call",
"token_count": 5033,
"component": "ui_changes",
"toolCallId": "toolu_01T1fMkdrKDvU9yWzw6ZEdCw",
"toolName": "Write",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ComponentsView.tsx",
"content": "import { useState, useMemo } from \"react\";\nimport { Slider } from \"@/components/ui/slider\";\nimport { WaffleChart } from \"./WaffleChart\";\nimport { CompactLegend } from \"./ComponentComparisonView\";\nimport { cn } from \"@/lib/utils\";\nimport { getComponentWaffleStyles, blendColors, getComponentWaffleHex } from \"@/lib/component-colors\";\nimport { getStaticComponentLabel } from \"@/lib/static-component-colors\";\nimport type { Conversation } from \"@/schema\";\nimport type { ComponentTimelineSnapshot, DimensionData } from \"@/componentisation\";\nimport { ChevronDown, ChevronRight, Plus, Pencil, Trash2, X } from \"lucide-react\";\n\n// Message type filter in format \"role:type\" (e.g., \"assistant:tool-call\")\ntype MessageTypeFilter = string;\n\ninterface ComponentsViewProps {\n componentMapping?: Record<string, string>;\n conversation: Conversation;\n componentTimeline?: ComponentTimelineSnapshot[];\n componentColors?: Record<string, string>;\n // Multi-dimensional component data\n dimensions?: Record<string, DimensionData>;\n activeDimensions?: Set<string>;\n onActiveDimensionsChange?: (dims: Set<string>) => void;\n // Dimension management\n onAddDimension?: (name: string) => void;\n onRemoveDimension?: (name: string) => void;\n onRenameDimension?: (oldName: string, newName: string) => void;\n onEditDimensionPrompt?: (dimensionName: string) => void;\n selectedComponent?: string | null;\n onComponentSelect?: (component: string | null) => void;\n // Static component filter - when set, only show automatic components for parts matching this static component\n staticMapping?: Record<string, string>;\n filterByStaticComponent?: string | null;\n // Filters from conversation view\n messageTypeFilters?: Set<MessageTypeFilter>;\n}\n\nexport function ComponentsView({\n componentMapping,\n conversation,\n componentTimeline,\n componentColors,\n dimensions,\n activeDimensions: activeDimensionsProp,\n onActiveDimensionsChange,\n onAddDimension,\n onRemoveDimension,\n onRenameDimension,\n onEditDimensionPrompt,\n selectedComponent,\n onComponentSelect,\n staticMapping,\n filterByStaticComponent,\n messageTypeFilters,\n}: ComponentsViewProps) {\n // Initialize slider to the last message\n const [currentMessageIndex, setCurrentMessageIndex] = useState(\n conversation.messages.length - 1\n );\n const [expandedDimension, setExpandedDimension] = useState<string | null>(null);\n const [addingDimension, setAddingDimension] = useState(false);\n const [newDimensionName, setNewDimensionName] = useState(\"\");\n const [renamingDimension, setRenamingDimension] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState(\"\");\n\n const activeDimensions = activeDimensionsProp || new Set([\"default\"]);\n const dimensionNames = useMemo(\n () => dimensions ? Object.keys(dimensions) : [],\n [dimensions],\n );\n const hasMultipleDimensions = dimensionNames.length > 1;\n\n // Determine effective mapping and colors based on active dimensions\n const effectiveMapping = useMemo(() => {\n if (!dimensions || activeDimensions.size <= 1) {\n // Single dimension or no dimensions: use the single active one, or fall back to legacy\n const activeName = [...activeDimensions][0] || \"default\";\n return dimensions?.[activeName]?.componentMapping || componentMapping || {};\n }\n // Multiple active: use default for the mapping (waffle chart is per-dimension)\n return componentMapping || {};\n }, [dimensions, activeDimensions, componentMapping]);\n\n const effectiveColors = useMemo(() => {\n if (!dimensions || activeDimensions.size <= 1) {\n const activeName = [...activeDimensions][0] || \"default\";\n return dimensions?.[activeName]?.componentColors || componentColors || {};\n }\n return componentColors || {};\n }, [dimensions, activeDimensions, componentColors]);\n\n // Helper to check if a part passes the message type filter\n const partPassesMessageTypeFilter = (part: { type: string }, msgRole: string): boolean => {\n if (!messageTypeFilters || messageTypeFilters.has(\"all\")) return true;\n const filterKey = `${msgRole}:${part.type}`;\n return messageTypeFilters.has(filterKey);\n };\n\n // Get the set of part IDs that match the static component filter\n const filteredPartIds = useMemo(() => {\n if (!filterByStaticComponent || !staticMapping) return null;\n\n const ids = new Set<string>();\n for (const [partId, staticComp] of Object.entries(staticMapping)) {\n if (staticComp === filterByStaticComponent) {\n ids.add(partId);\n }\n }\n return ids;\n }, [filterByStaticComponent, staticMapping]);\n\n // Compute messageComponents for workflow view (filtered, up to current slider position)\n // Must be before early return to follow React hooks rules\n const messageComponents = useMemo(() => {\n if (!effectiveMapping || Object.keys(effectiveMapping).length === 0) return [];\n const components: string[] = [];\n conversation.messages.forEach((message, msgIndex) => {\n if (msgIndex <= currentMessageIndex) {\n // Find the primary component for this message from first matching part\n let messageComponent: string | null = null;\n for (const part of message.parts) {\n // Apply message type filter\n if (!partPassesMessageTypeFilter(part, message.role)) continue;\n\n // Apply static component filter if set\n if (filteredPartIds && !filteredPartIds.has(part.id)) continue;\n\n const component = effectiveMapping[part.id];\n if (component) {\n messageComponent = component;\n break;\n }\n }\n // Only include message if it has parts that pass filters\n if (messageComponent !== null) {\n components.push(messageComponent);\n }\n }\n });\n return components;\n }, [conversation.messages, currentMessageIndex, effectiveMapping, filteredPartIds, messageTypeFilters]);\n\n if (!effectiveMapping || Object.keys(effectiveMapping).length === 0) {\n return (\n <div className=\"p-8 text-center text-muted-foreground\">\n <p>No component mapping available yet.</p>\n <p className=\"text-sm mt-2\">\n Component mapping will appear here after processing.\n </p>\n </div>\n );\n }\n\n // Get component data for the current message, filtered by static component and message type\n let componentTokensForOverview: Record<string, number> = {};\n let filteredTokensTotal = 0;\n let fullTokensTotal = 0;\n\n // Always calculate from conversation to apply filtering\n conversation.messages.forEach((message, msgIndex) => {\n if (msgIndex <= currentMessageIndex) {\n message.parts.forEach((part) => {\n const component = effectiveMapping[part.id];\n if (component) {\n const tokenCount = (\"token_count\" in part && part.token_count) || 0;\n fullTokensTotal += tokenCount;\n\n // Apply message type filter first\n if (!partPassesMessageTypeFilter(part, message.role)) return;\n\n // Apply static component filter if set\n if (!filteredPartIds || filteredPartIds.has(part.id)) {\n componentTokensForOverview[component] =\n (componentTokensForOverview[component] || 0) + tokenCount;\n filteredTokensTotal += tokenCount;\n }\n }\n });\n }\n });\n\n const handleComponentClick = (component: string) => {\n const newSelection = selectedComponent === component ? null : component;\n onComponentSelect?.(newSelection);\n };\n\n // Check if message type filters are active\n const hasMessageTypeFilters = messageTypeFilters && !messageTypeFilters.has(\"all\") && messageTypeFilters.size > 0;\n\n // Helper to get blended waffle styles for multi-dimension view\n const getWaffleStylesForDimensions = (component: string) => {\n if (!dimensions || activeDimensions.size <= 1) {\n return getComponentWaffleStyles(component, effectiveColors);\n }\n // Multi-dimension: blend colors\n const activeDimNames = [...activeDimensions];\n const colors = activeDimNames\n .map((dimName) => {\n const dim = dimensions[dimName];\n if (!dim) return null;\n // Find the component color in this dimension\n return getComponentWaffleHex(component, dim.componentColors);\n })\n .filter((c): c is string => c !== null);\n\n if (colors.length === 0) return getComponentWaffleStyles(component, effectiveColors);\n const blended = colors.length === 1 ? colors[0]! : blendColors(colors);\n return { classes: null, style: { backgroundColor: blended } };\n };\n\n const handleToggleDimension = (dimName: string) => {\n const next = new Set(activeDimensions);\n if (next.has(dimName)) {\n if (next.size > 1) next.delete(dimName); // Keep at least one active\n } else {\n next.add(dimName);\n }\n onActiveDimensionsChange?.(next);\n };\n\n return (\n <div className=\"p-4\">\n {/* Dimension Management Accordion */}\n {dimensionNames.length > 0 && (\n <div className=\"mb-4 border rounded-lg\">\n <div className=\"px-3 py-2 bg-muted/50 flex items-center justify-between\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Dimensions ({dimensionNames.length})\n </span>\n {onAddDimension && (\n <button\n onClick={() => setAddingDimension(true)}\n className=\"text-xs text-blue-600 hover:text-blue-700 flex items-center gap-1\"\n >\n <Plus className=\"h-3 w-3\" /> Add\n </button>\n )}\n </div>\n\n {/* Add dimension input */}\n {addingDimension && (\n <div className=\"px-3 py-2 border-t flex items-center gap-2\">\n <input\n type=\"text\"\n value={newDimensionName}\n onChange={(e) => setNewDimensionName(e.target.value)}\n placeholder=\"Dimension name...\"\n className=\"flex-1 text-sm border rounded px-2 py-1\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && newDimensionName.trim()) {\n onAddDimension?.(newDimensionName.trim());\n setNewDimensionName(\"\");\n setAddingDimension(false);\n }\n if (e.key === \"Escape\") {\n setAddingDimension(false);\n setNewDimensionName(\"\");\n }\n }}\n />\n <button\n onClick={() => {\n if (newDimensionName.trim()) {\n onAddDimension?.(newDimensionName.trim());\n setNewDimensionName(\"\");\n }\n setAddingDimension(false);\n }}\n className=\"text-xs text-blue-600 hover:text-blue-700\"\n >\n Add\n </button>\n <button\n onClick={() => { setAddingDimension(false); setNewDimensionName(\"\"); }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n\n {/* Dimension list */}\n {dimensionNames.map((dimName) => {\n const dimData = dimensions![dimName]!;\n const isExpanded = expandedDimension === dimName;\n const isActive = activeDimensions.has(dimName);\n\n return (\n <div key={dimName} className=\"border-t\">\n <div className=\"flex items-center gap-2 px-3 py-1.5\">\n {/* Active checkbox */}\n <input\n type=\"checkbox\"\n checked={isActive}\n onChange={() => handleToggleDimension(dimName)}\n className=\"h-3 w-3 accent-blue-600\"\n />\n\n {/* Expand/collapse */}\n <button\n onClick={() => setExpandedDimension(isExpanded ? null : dimName)}\n className=\"flex items-center gap-1 flex-1 text-left\"\n >\n {isExpanded ? (\n <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n )}\n\n {renamingDimension === dimName ? (\n <input\n type=\"text\"\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n className=\"text-sm border rounded px-1 py-0 flex-1\"\n autoFocus\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\" && renameValue.trim()) {\n onRenameDimension?.(dimName, renameValue.trim());\n setRenamingDimension(null);\n }\n if (e.key === \"Escape\") setRenamingDimension(null);\n }}\n onBlur={() => {\n if (renameValue.trim() && renameValue.trim() !== dimName) {\n onRenameDimension?.(dimName, renameValue.trim());\n }\n setRenamingDimension(null);\n }}\n />\n ) : (\n <span className=\"text-sm font-medium\">{dimName}</span>\n )}\n </button>\n\n {/* Component count badge */}\n <span className=\"text-xs text-muted-foreground\">\n {dimData.components.length} components\n </span>\n\n {/* Actions */}\n {onEditDimensionPrompt && (\n <button\n onClick={(e) => { e.stopPropagation(); onEditDimensionPrompt(dimName); }}\n className=\"text-muted-foreground hover:text-foreground\"\n title=\"Edit prompt\"\n >\n <Pencil className=\"h-3 w-3\" />\n </button>\n )}\n {onRenameDimension && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n setRenamingDimension(dimName);\n setRenameValue(dimName);\n }}\n className=\"text-muted-foreground hover:text-foreground text-xs\"\n title=\"Rename\"\n >\n Aa\n </button>\n )}\n {dimName !== \"default\" && onRemoveDimension && (\n <button\n onClick={(e) => { e.stopPropagation(); onRemoveDimension(dimName); }}\n className=\"text-muted-foreground hover:text-red-600\"\n title=\"Remove dimension\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n\n {/* Expanded: show components list */}\n {isExpanded && (\n <div className=\"px-8 py-2 bg-muted/30 text-xs space-y-1\">\n {dimData.components.length === 0 ? (\n <p className=\"text-muted-foreground italic\">No components yet. Edit the prompt to run componentisation.</p>\n ) : (\n dimData.components.map((comp) => {\n const colorStyles = getComponentWaffleStyles(comp, dimData.componentColors);\n return (\n <div key={comp} className=\"flex items-center gap-2\">\n <div\n className={cn(\"w-3 h-3 rounded-sm flex-shrink-0\", colorStyles.classes)}\n style={colorStyles.style || undefined}\n />\n <span>{comp}</span>\n </div>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Filter indicator */}\n {(filterByStaticComponent || hasMessageTypeFilters) && (\n <div className=\"mb-3 text-sm text-blue-600 bg-blue-50 px-3 py-1.5 rounded-md\">\n {hasMessageTypeFilters && \"Filtered view\"}\n {hasMessageTypeFilters && filterByStaticComponent && \" · \"}\n {filterByStaticComponent && (\n <>Filtering by <strong>{getStaticComponentLabel(filterByStaticComponent)}</strong></>\n )}\n {\" · \"}{filteredTokensTotal.toLocaleString()} tokens\n </div>\n )}\n\n {/* Active dimension indicator */}\n {hasMultipleDimensions && (\n <div className=\"mb-3 text-xs text-muted-foreground\">\n Viewing: {[...activeDimensions].join(\", \")}\n </div>\n )}\n\n {/* Per-dimension waffle charts when multiple active */}\n {hasMultipleDimensions && activeDimensions.size > 1 ? (\n <div className=\"space-y-4\">\n {[...activeDimensions].map((dimName) => {\n const dim = dimensions?.[dimName];\n if (!dim) return null;\n\n // Calculate per-dimension token data\n const dimTokens: Record<string, number> = {};\n let dimTotal = 0;\n conversation.messages.forEach((message, msgIndex) => {\n if (msgIndex <= currentMessageIndex) {\n message.parts.forEach((part) => {\n const component = dim.componentMapping[part.id];\n if (component) {\n const tokenCount = (\"token_count\" in part && part.token_count) || 0;\n if (!partPassesMessageTypeFilter(part, message.role)) return;\n if (filteredPartIds && !filteredPartIds.has(part.id)) return;\n dimTokens[component] = (dimTokens[component] || 0) + tokenCount;\n dimTotal += tokenCount;\n }\n });\n }\n });\n\n return (\n <div key={dimName}>\n <h4 className=\"text-sm font-medium text-muted-foreground mb-2\">{dimName}</h4>\n <WaffleChart\n componentTokens={dimTokens}\n totalTokens={dimTotal}\n getColorStyles={(component) => getComponentWaffleStyles(component, dim.componentColors)}\n getLabel={(component) => component}\n onComponentClick={handleComponentClick}\n />\n </div>\n );\n })}\n </div>\n ) : (\n <>\n {/* Timeline Slider */}\n <div className=\"mb-4 px-2\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium text-muted-foreground\">\n Message {currentMessageIndex + 1} of {conversation.messages.length}\n </span>\n <span className=\"text-sm font-semibold text-foreground\">\n {fullTokensTotal.toLocaleString()} tokens\n </span>\n </div>\n <Slider\n value={[currentMessageIndex]}\n onValueChange={(value) => setCurrentMessageIndex(value[0] ?? 0)}\n min={0}\n max={conversation.messages.length - 1}\n step={1}\n className=\"w-full\"\n />\n </div>\n\n {/* Waffle Chart */}\n <WaffleChart\n componentTokens={componentTokensForOverview}\n totalTokens={filteredTokensTotal}\n getColorStyles={(component) => getWaffleStylesForDimensions(component)}\n getLabel={(component) => component}\n onComponentClick={handleComponentClick}\n />\n </>\n )}\n\n {/* Workflow Diagram - horizontal sequence of messages */}\n {messageComponents.length > 0 && (\n <div className=\"mt-6 pt-4 border-t\">\n <h4 className=\"text-sm font-medium text-muted-foreground mb-3\">\n Workflow ({messageComponents.length} messages)\n </h4>\n <div className=\"flex flex-wrap gap-0.5\">\n {messageComponents.map((component, index) => {\n const colorStyles = component ? getWaffleStylesForDimensions(component) : null;\n return (\n <div\n key={index}\n className={cn(\n \"w-3 h-3 flex-shrink-0\",\n component ? colorStyles?.classes : \"bg-gray-200\",\n )}\n style={colorStyles?.style || undefined}\n title={`${index + 1}: ${component || \"unknown\"}`}\n />\n );\n })}\n </div>\n <div className=\"mt-3\">\n <CompactLegend\n components={messageComponents}\n componentColors={effectiveColors}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n"
}
}
]
},
{
"id": "400",
"role": "tool",
"timestamp": "2026-03-09T18:41:38.253Z",
"parts": [
{
"id": "401",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01T1fMkdrKDvU9yWzw6ZEdCw",
"toolName": "Write",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/ComponentsView.tsx has been updated successfully."
}
]
},
{
"id": "404",
"role": "assistant",
"timestamp": "2026-03-09T18:41:43.374Z",
"parts": [
{
"id": "402",
"type": "text",
"token_count": 12,
"component": "ui_changes",
"text": "### Step 12: Update ComponentComparisonView with dimension support"
},
{
"id": "403",
"type": "tool-call",
"token_count": 34,
"component": "ui_changes",
"toolCallId": "toolu_011hEneDLU8ib3mRm1MT1huo",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ComponentComparisonView.tsx",
"limit": 60,
"offset": 85
}
}
]
},
{
"id": "405",
"role": "tool",
"timestamp": "2026-03-09T18:41:44.248Z",
"parts": [
{
"id": "406",
"type": "tool-result",
"token_count": 786,
"component": "ui_changes",
"toolCallId": "toolu_011hEneDLU8ib3mRm1MT1huo",
"toolName": "Read",
"output": " 85→export type ViewMode = \"tokens\" | \"workflow\" | \"tokens-absolute\";\n 86→export type LegendMode = \"expanded\" | \"compact\";\n 87→export type { SortField, SortDirection };\n 88→\n 89→interface ComponentComparisonViewProps {\n 90→ sourceConversations: ConversationComponentData[];\n 91→ componentColors?: Record<string, string>;\n 92→ hasActiveFilters?: boolean;\n 93→ groupTitle?: string;\n 94→ onConversationClick?: (id: string) => void;\n 95→ // Controlled state props (optional - falls back to local state if not provided)\n 96→ viewMode?: ViewMode;\n 97→ onViewModeChange?: (mode: ViewMode) => void;\n 98→ legendMode?: LegendMode;\n 99→ onLegendModeChange?: (mode: LegendMode) => void;\n 100→ sortField?: SortField;\n 101→ onSortFieldChange?: (field: SortField) => void;\n 102→ sortDirection?: SortDirection;\n 103→ onSortDirectionChange?: (dir: SortDirection) => void;\n 104→ columnCount?: number;\n 105→ onColumnCountChange?: (cols: number) => void;\n 106→ squaresPerRow?: number;\n 107→ onSquaresPerRowChange?: (spr: number) => void;\n 108→}\n 109→\n 110→/**\n 111→ * Compact legend - horizontal list of color squares with labels (no percentages)\n 112→ * Used for both workflow view and compact token view\n 113→ */\n 114→export function CompactLegend({\n 115→ components,\n 116→ componentColors,\n 117→}: {\n 118→ components: string[];\n 119→ componentColors?: Record<string, string>;\n 120→}) {\n 121→ // Get unique components preserving order\n 122→ const uniqueComponents = [...new Set(components)].filter(Boolean);\n 123→\n 124→ return (\n 125→ <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n 126→ {uniqueComponents.map((component) => {\n 127→ const colorStyles = getComponentWaffleStyles(component, componentColors);\n 128→ return (\n 129→ <div key={component} className=\"flex items-center gap-1.5\">\n 130→ <span\n 131→ className={cn(\n 132→ \"w-3 h-3 flex-shrink-0\",\n 133→ colorStyles.classes,\n 134→ )}\n 135→ style={colorStyles.style || undefined}\n 136→ />\n 137→ <span className=\"text-muted-foreground [font-variant:small-caps]\">{component}</span>\n 138→ </div>\n 139→ );\n 140→ })}\n 141→ </div>\n 142→ );\n 143→}\n 144→"
}
]
},
{
"id": "409",
"role": "assistant",
"timestamp": "2026-03-09T18:41:52.975Z",
"parts": [
{
"id": "407",
"type": "text",
"token_count": 84,
"component": "ui_changes",
"text": "The ComponentComparisonView is already quite complex. For now, I'll add the `dimensions` prop to `ConversationComponentData` and pass dimension info to the comparison view. But the core comparison logic can remain working with the legacy `componentTokens` field — the dimension selector in the comparison view can switch which dimension's data is shown.\n\nLet me update the `ConversationComponentData` and the comparison view to accept dimensions:"
},
{
"id": "408",
"type": "tool-call",
"token_count": 313,
"component": "ui_changes",
"toolCallId": "toolu_018Hb6RrLiViiWUxbmZsJFAh",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ComponentComparisonView.tsx",
"old_string": "export interface ConversationComponentData {\n id: string;\n filename: string;\n title?: string; // Custom title, displays instead of filename when set\n componentTokens: Record<string, number>;\n totalTokens: number;\n turnCount: number; // Number of user messages (turns)\n messageCount: number; // Total messages\n durationMs?: number; // Duration in milliseconds (from first to last message)\n messageComponents?: string[]; // Component for each message in order (for workflow view)\n}",
"new_string": "export interface ConversationComponentData {\n id: string;\n filename: string;\n title?: string; // Custom title, displays instead of filename when set\n componentTokens: Record<string, number>;\n totalTokens: number;\n turnCount: number; // Number of user messages (turns)\n messageCount: number; // Total messages\n durationMs?: number; // Duration in milliseconds (from first to last message)\n messageComponents?: string[]; // Component for each message in order (for workflow view)\n // Multi-dimensional data\n dimensionData?: Record<string, {\n componentTokens: Record<string, number>;\n messageComponents?: string[];\n }>;\n}"
}
}
]
},
{
"id": "410",
"role": "tool",
"timestamp": "2026-03-09T18:42:00.575Z",
"parts": [
{
"id": "411",
"type": "tool-result",
"token_count": 28,
"component": "ui_changes",
"toolCallId": "toolu_018Hb6RrLiViiWUxbmZsJFAh",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/ComponentComparisonView.tsx has been updated successfully."
}
]
},
{
"id": "414",
"role": "assistant",
"timestamp": "2026-03-09T18:42:05.320Z",
"parts": [
{
"id": "412",
"type": "text",
"token_count": 22,
"component": "understanding_codebase",
"text": "Now let me also look at where the comparison view is rendered to pass `dimensions` and `activeDimensions`:"
},
{
"id": "413",
"type": "tool-call",
"token_count": 42,
"component": "understanding_codebase",
"toolCallId": "toolu_01D2VZNgnJKUD77YSq3DTAos",
"toolName": "Grep",
"input": {
"pattern": "<ComponentComparisonView",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "415",
"role": "tool",
"timestamp": "2026-03-09T18:42:06.588Z",
"parts": [
{
"id": "416",
"type": "tool-result",
"token_count": 12,
"component": "understanding_codebase",
"toolCallId": "toolu_01D2VZNgnJKUD77YSq3DTAos",
"toolName": "Grep",
"output": "1215: <ComponentComparisonView"
}
]
},
{
"id": "418",
"role": "assistant",
"timestamp": "2026-03-09T18:42:10.330Z",
"parts": [
{
"id": "417",
"type": "tool-call",
"token_count": 34,
"component": "understanding_codebase",
"toolCallId": "toolu_01BtgVxbcMAtZM89Hdnv4AE9",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"limit": 30,
"offset": 1215
}
}
]
},
{
"id": "419",
"role": "tool",
"timestamp": "2026-03-09T18:42:10.375Z",
"parts": [
{
"id": "420",
"type": "tool-result",
"token_count": 342,
"component": "understanding_codebase",
"toolCallId": "toolu_01BtgVxbcMAtZM89Hdnv4AE9",
"toolName": "Read",
"output": " 1215→ <ComponentComparisonView\n 1216→ sourceConversations={filteredSourceConversationComponents}\n 1217→ componentColors={componentColors}\n 1218→ hasActiveFilters={!hasAllFilters}\n 1219→ groupTitle={groupTitle}\n 1220→ onConversationClick={onConversationClick}\n 1221→ viewMode={comparisonViewMode}\n 1222→ onViewModeChange={onComparisonViewModeChange}\n 1223→ legendMode={comparisonLegendMode}\n 1224→ onLegendModeChange={onComparisonLegendModeChange}\n 1225→ sortField={comparisonSortField}\n 1226→ onSortFieldChange={onComparisonSortFieldChange}\n 1227→ sortDirection={comparisonSortDirection}\n 1228→ onSortDirectionChange={onComparisonSortDirectionChange}\n 1229→ columnCount={comparisonColumnCount}\n 1230→ onColumnCountChange={onComparisonColumnCountChange}\n 1231→ squaresPerRow={comparisonSquaresPerRow}\n 1232→ onSquaresPerRowChange={onComparisonSquaresPerRowChange}\n 1233→ />\n 1234→ </TabsContent>\n 1235→ )}\n 1236→ </Tabs>\n 1237→ );\n 1238→}\n 1239→"
}
]
},
{
"id": "423",
"role": "assistant",
"timestamp": "2026-03-09T18:42:15.773Z",
"parts": [
{
"id": "421",
"type": "text",
"token_count": 54,
"component": "workflow_refactor",
"text": "Good. For now the comparison view will work with the existing `componentTokens` (which comes from the default dimension). This is the expected behavior — the comparison view already works as-is for the default dimension.\n\n### Step 13: Now let's verify the build compiles"
},
{
"id": "422",
"type": "tool-call",
"token_count": 53,
"component": "tests_and_build",
"toolCallId": "toolu_017cL7ZX297v2Jtv36w8U3pG",
"toolName": "Bash",
"input": {
"command": "npx tsc --noEmit 2>&1 | grep -E \"ComponentsView|ConversationView|App\\.tsx\" | head -20",
"description": "Check for new TypeScript errors in changed files",
"timeout": 30000
}
}
]
},
{
"id": "424",
"role": "tool",
"timestamp": "2026-03-09T18:42:21.803Z",
"parts": [
{
"id": "425",
"type": "tool-result",
"token_count": 177,
"component": "tests_and_build",
"toolCallId": "toolu_017cL7ZX297v2Jtv36w8U3pG",
"toolName": "Bash",
"output": "src/App.tsx(903,7): error TS2367: This comparison appears to be unintentional because the types 'WorkflowEvent.NewFile | WorkflowEvent.ComponentPromptChanged | WorkflowEvent.SegmentationPromptChanged | WorkflowEvent.GenerateAnalysis' and 'WorkflowEvent.GroupedConversation' have no overlap.\nsrc/App.tsx(2830,45): error TS2339: Property 'filter' does not exist on type 'Map<number, string>'.\nsrc/App.tsx(2830,53): error TS7006: Parameter 'fid' implicitly has an 'any' type.\nsrc/App.tsx(2901,32): error TS18048: 'fileExport' is possibly 'undefined'.\nsrc/App.tsx(2908,17): error TS18048: 'fileExport' is possibly 'undefined'."
}
]
},
{
"id": "428",
"role": "assistant",
"timestamp": "2026-03-09T18:42:28.387Z",
"parts": [
{
"id": "426",
"type": "text",
"token_count": 27,
"component": "tests_and_build",
"text": "All pre-existing errors only. No new errors from my changes. Let me verify by checking if the Vite dev server can build:"
},
{
"id": "427",
"type": "tool-call",
"token_count": 30,
"component": "tests_and_build",
"toolCallId": "toolu_012GjHcgwNCxk6JBCTUXC5pH",
"toolName": "Bash",
"input": {
"command": "npx vite build 2>&1 | tail -10",
"description": "Test Vite build",
"timeout": 60000
}
}
]
},
{
"id": "429",
"role": "tool",
"timestamp": "2026-03-09T18:42:36.392Z",
"parts": [
{
"id": "430",
"type": "tool-result",
"token_count": 191,
"component": "tests_and_build",
"toolCallId": "toolu_012GjHcgwNCxk6JBCTUXC5pH",
"toolName": "Bash",
"output": "dist/index.html 0.43 kB │ gzip: 0.28 kB\ndist/assets/tiktoken_bg-YjhjrOPs.wasm 5,593.29 kB\ndist/assets/index-gfkb_LMi.css 42.21 kB │ gzip: 8.10 kB\ndist/assets/index-DTcC-g5O.js 2,590.85 kB │ gzip: 513.27 kB\n\n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n✓ built in 5.41s"
}
]
},
{
"id": "433",
"role": "assistant",
"timestamp": "2026-03-09T18:42:43.567Z",
"parts": [
{
"id": "431",
"type": "text",
"token_count": 22,
"component": "ui_changes",
"text": "Build succeeds. Let me now also update the MessagePartView to show multiple dimension badges when viewing multiple dimensions:"
},
{
"id": "432",
"type": "tool-call",
"token_count": 30,
"component": "understanding_codebase",
"toolCallId": "toolu_01JMsU3iQd3YPwYSBdSkeRRy",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"limit": 60
}
}
]
},
{
"id": "434",
"role": "tool",
"timestamp": "2026-03-09T18:42:44.263Z",
"parts": [
{
"id": "435",
"type": "tool-result",
"token_count": 712,
"component": "understanding_codebase",
"toolCallId": "toolu_01JMsU3iQd3YPwYSBdSkeRRy",
"toolName": "Read",
"output": " 1→import { useEffect, useState } from \"react\";\n 2→import {\n 3→ Collapsible,\n 4→ CollapsibleContent,\n 5→ CollapsibleTrigger,\n 6→} from \"@/components/ui/collapsible\";\n 7→import { Badge } from \"@/components/ui/badge\";\n 8→import { ChevronRight, ChevronDown } from \"lucide-react\";\n 9→import { getComponentBadgeStyles } from \"@/lib/component-colors\";\n 10→import { cn } from \"@/lib/utils\";\n 11→import type {\n 12→ TextPart,\n 13→ ReasoningPart,\n 14→ ToolCallPart,\n 15→ ToolResultPart,\n 16→ ImagePart,\n 17→ FilePart,\n 18→ SourceInfo,\n 19→} from \"@/schema\";\n 20→\n 21→type MessagePart =\n 22→ | TextPart\n 23→ | ReasoningPart\n 24→ | ToolCallPart\n 25→ | ToolResultPart\n 26→ | ImagePart\n 27→ | FilePart;\n 28→\n 29→interface MessagePartViewProps {\n 30→ part: MessagePart;\n 31→ isExpanded?: boolean;\n 32→ componentMapping?: Record<string, string>;\n 33→ componentColors?: Record<string, string>;\n 34→ onComponentClick?: (component: string) => void;\n 35→ sourceInfo?: SourceInfo;\n 36→}\n 37→\n 38→export function MessagePartView({ part, isExpanded = false, componentMapping, componentColors, onComponentClick, sourceInfo }: MessagePartViewProps) {\n 39→ const [isOpen, setIsOpen] = useState(isExpanded);\n 40→\n 41→ // Sync with parent's isExpanded prop\n 42→ useEffect(() => {\n 43→ setIsOpen(isExpanded);\n 44→ }, [isExpanded]);\n 45→\n 46→ const getPartLabel = () => {\n 47→ switch (part.type) {\n 48→ case \"text\":\n 49→ return \"Text\";\n 50→ case \"reasoning\":\n 51→ return \"Reasoning\";\n 52→ case \"tool-call\":\n 53→ return \"Tool Call\";\n 54→ case \"tool-result\":\n 55→ return \"Tool Result\";\n 56→ case \"image\":\n 57→ return \"Image\";\n 58→ case \"file\":\n 59→ return \"File\";\n 60→ default:"
}
]
},
{
"id": "437",
"role": "assistant",
"timestamp": "2026-03-09T18:42:49.869Z",
"parts": [
{
"id": "436",
"type": "tool-call",
"token_count": 48,
"component": "understanding_codebase",
"toolCallId": "toolu_0152Pdvc8GgznKpP6bDJf5iN",
"toolName": "Grep",
"input": {
"pattern": "componentMapping\\[part\\.id\\]",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "438",
"role": "tool",
"timestamp": "2026-03-09T18:42:49.899Z",
"parts": [
{
"id": "439",
"type": "tool-result",
"token_count": 6,
"component": "understanding_codebase",
"toolCallId": "toolu_0152Pdvc8GgznKpP6bDJf5iN",
"toolName": "Grep",
"output": "No matches found"
}
]
},
{
"id": "441",
"role": "assistant",
"timestamp": "2026-03-09T18:42:54.605Z",
"parts": [
{
"id": "440",
"type": "tool-call",
"token_count": 41,
"component": "understanding_codebase",
"toolCallId": "toolu_011WEGWv6ynhhAEvGcij7Uku",
"toolName": "Grep",
"input": {
"pattern": "componentMapping",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "442",
"role": "tool",
"timestamp": "2026-03-09T18:42:54.662Z",
"parts": [
{
"id": "443",
"type": "tool-result",
"token_count": 65,
"component": "understanding_codebase",
"toolCallId": "toolu_011WEGWv6ynhhAEvGcij7Uku",
"toolName": "Grep",
"output": "32: componentMapping?: Record<string, string>;\n38:export function MessagePartView({ part, isExpanded = false, componentMapping, componentColors, onComponentClick, sourceInfo }: MessagePartViewProps) {\n183: const component = componentMapping?.[part.id];"
}
]
},
{
"id": "445",
"role": "assistant",
"timestamp": "2026-03-09T18:42:58.139Z",
"parts": [
{
"id": "444",
"type": "tool-call",
"token_count": 34,
"component": "understanding_codebase",
"toolCallId": "toolu_01FfLHYXet6EX7Ka6VRktbYC",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"limit": 30,
"offset": 180
}
}
]
},
{
"id": "446",
"role": "tool",
"timestamp": "2026-03-09T18:42:58.199Z",
"parts": [
{
"id": "447",
"type": "tool-result",
"token_count": 431,
"component": "understanding_codebase",
"toolCallId": "toolu_01FfLHYXet6EX7Ka6VRktbYC",
"toolName": "Read",
"output": " 180→ const tokenCount = getTokenCount();\n 181→\n 182→ // Get component for this part\n 183→ const component = componentMapping?.[part.id];\n 184→\n 185→ return (\n 186→ <Collapsible open={isOpen} onOpenChange={setIsOpen} className=\"border rounded-md\">\n 187→ <CollapsibleTrigger className=\"flex items-center justify-between w-full p-3 hover:bg-muted/50 transition-colors\">\n 188→ <div className=\"flex items-center gap-2\">\n 189→ {isOpen ? (\n 190→ <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\n 191→ ) : (\n 192→ <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n 193→ )}\n 194→ <span className=\"text-sm\">{getPartEmoji()}</span>\n 195→ <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n 196→ {getPartLabel()}\n 197→ </span>\n 198→ {tokenCount !== null && (\n 199→ <Badge variant=\"secondary\" className=\"text-xs\">\n 200→ {tokenCount} tokens\n 201→ </Badge>\n 202→ )}\n 203→ {component && (() => {\n 204→ const { classes, style } = getComponentBadgeStyles(component, componentColors);\n 205→ return (\n 206→ <Badge\n 207→ variant=\"outline\"\n 208→ className={cn(\n 209→ \"text-xs font-medium border\","
}
]
},
{
"id": "449",
"role": "assistant",
"timestamp": "2026-03-09T18:43:01.932Z",
"parts": [
{
"id": "448",
"type": "tool-call",
"token_count": 34,
"component": "understanding_codebase",
"toolCallId": "toolu_01VFzV7PmTGkDvycg9vFwLgT",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"limit": 30,
"offset": 210
}
}
]
},
{
"id": "450",
"role": "tool",
"timestamp": "2026-03-09T18:43:02.003Z",
"parts": [
{
"id": "451",
"type": "tool-result",
"token_count": 235,
"component": "understanding_codebase",
"toolCallId": "toolu_01VFzV7PmTGkDvycg9vFwLgT",
"toolName": "Read",
"output": " 210→ classes,\n 211→ onComponentClick && \"cursor-pointer hover:opacity-80 transition-opacity\"\n 212→ )}\n 213→ style={style || undefined}\n 214→ onClick={(e) => {\n 215→ if (onComponentClick) {\n 216→ e.stopPropagation();\n 217→ onComponentClick(component);\n 218→ }\n 219→ }}\n 220→ >\n 221→ {component}\n 222→ </Badge>\n 223→ );\n 224→ })()}\n 225→ </div>\n 226→ </CollapsibleTrigger>\n 227→ <CollapsibleContent className=\"px-3 pb-3\">{renderPartContent()}</CollapsibleContent>\n 228→ </Collapsible>\n 229→ );\n 230→}\n 231→"
}
]
},
{
"id": "454",
"role": "assistant",
"timestamp": "2026-03-09T18:43:06.875Z",
"parts": [
{
"id": "452",
"type": "text",
"token_count": 34,
"component": "ui_changes",
"text": "Now let me add dimension support to MessagePartView. I'll add optional `dimensions` and `activeDimensions` props, and show multiple badges when multiple dimensions are active:"
},
{
"id": "453",
"type": "tool-call",
"token_count": 401,
"component": "ui_changes",
"toolCallId": "toolu_01Q2Lf3Bg1tTj681Jdr3EfVP",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"old_string": "import type {\n TextPart,\n ReasoningPart,\n ToolCallPart,\n ToolResultPart,\n ImagePart,\n FilePart,\n SourceInfo,\n} from \"@/schema\";\n\ntype MessagePart =\n | TextPart\n | ReasoningPart\n | ToolCallPart\n | ToolResultPart\n | ImagePart\n | FilePart;\n\ninterface MessagePartViewProps {\n part: MessagePart;\n isExpanded?: boolean;\n componentMapping?: Record<string, string>;\n componentColors?: Record<string, string>;\n onComponentClick?: (component: string) => void;\n sourceInfo?: SourceInfo;\n}",
"new_string": "import type {\n TextPart,\n ReasoningPart,\n ToolCallPart,\n ToolResultPart,\n ImagePart,\n FilePart,\n SourceInfo,\n} from \"@/schema\";\nimport type { DimensionData } from \"@/componentisation\";\n\ntype MessagePart =\n | TextPart\n | ReasoningPart\n | ToolCallPart\n | ToolResultPart\n | ImagePart\n | FilePart;\n\ninterface MessagePartViewProps {\n part: MessagePart;\n isExpanded?: boolean;\n componentMapping?: Record<string, string>;\n componentColors?: Record<string, string>;\n onComponentClick?: (component: string) => void;\n sourceInfo?: SourceInfo;\n // Multi-dimension support\n dimensions?: Record<string, DimensionData>;\n activeDimensions?: Set<string>;\n}"
}
}
]
},
{
"id": "455",
"role": "tool",
"timestamp": "2026-03-09T18:43:11.577Z",
"parts": [
{
"id": "456",
"type": "tool-result",
"token_count": 28,
"component": "ui_changes",
"toolCallId": "toolu_01Q2Lf3Bg1tTj681Jdr3EfVP",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx has been updated successfully."
}
]
},
{
"id": "458",
"role": "assistant",
"timestamp": "2026-03-09T18:43:18.400Z",
"parts": [
{
"id": "457",
"type": "tool-call",
"token_count": 108,
"component": "ui_changes",
"toolCallId": "toolu_0146xqsPNk7Shu4x9FdtjGrZ",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"old_string": "export function MessagePartView({ part, isExpanded = false, componentMapping, componentColors, onComponentClick, sourceInfo }: MessagePartViewProps) {",
"new_string": "export function MessagePartView({ part, isExpanded = false, componentMapping, componentColors, onComponentClick, sourceInfo, dimensions, activeDimensions }: MessagePartViewProps) {"
}
}
]
},
{
"id": "459",
"role": "tool",
"timestamp": "2026-03-09T18:43:18.479Z",
"parts": [
{
"id": "460",
"type": "tool-result",
"token_count": 28,
"component": "ui_changes",
"toolCallId": "toolu_0146xqsPNk7Shu4x9FdtjGrZ",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx has been updated successfully."
}
]
},
{
"id": "463",
"role": "assistant",
"timestamp": "2026-03-09T18:43:23.383Z",
"parts": [
{
"id": "461",
"type": "text",
"token_count": 12,
"component": "ui_changes",
"text": "Now update the component badge rendering to show multiple dimension badges:"
},
{
"id": "462",
"type": "tool-call",
"token_count": 1145,
"component": "ui_changes",
"toolCallId": "toolu_01P32vzR7LRwT5Zauw2zN1Ep",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx",
"old_string": " // Get component for this part\n const component = componentMapping?.[part.id];\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen} className=\"border rounded-md\">\n <CollapsibleTrigger className=\"flex items-center justify-between w-full p-3 hover:bg-muted/50 transition-colors\">\n <div className=\"flex items-center gap-2\">\n {isOpen ? (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n <span className=\"text-sm\">{getPartEmoji()}</span>\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {getPartLabel()}\n </span>\n {tokenCount !== null && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {tokenCount} tokens\n </Badge>\n )}\n {component && (() => {\n const { classes, style } = getComponentBadgeStyles(component, componentColors);\n return (\n <Badge\n variant=\"outline\"\n className={cn(\n \"text-xs font-medium border\",\n classes,\n onComponentClick && \"cursor-pointer hover:opacity-80 transition-opacity\"\n )}\n style={style || undefined}\n onClick={(e) => {\n if (onComponentClick) {\n e.stopPropagation();\n onComponentClick(component);\n }\n }}\n >\n {component}\n </Badge>\n );\n })()}",
"new_string": " // Get component(s) for this part - support multi-dimension\n const component = componentMapping?.[part.id];\n const dimensionBadges = dimensions && activeDimensions && activeDimensions.size > 1\n ? [...activeDimensions].map((dimName) => {\n const dim = dimensions[dimName];\n if (!dim) return null;\n const comp = dim.componentMapping[part.id];\n if (!comp) return null;\n return { dimName, component: comp, colors: dim.componentColors };\n }).filter((b): b is { dimName: string; component: string; colors: Record<string, string> } => b !== null)\n : null;\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen} className=\"border rounded-md\">\n <CollapsibleTrigger className=\"flex items-center justify-between w-full p-3 hover:bg-muted/50 transition-colors\">\n <div className=\"flex items-center gap-2\">\n {isOpen ? (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n <span className=\"text-sm\">{getPartEmoji()}</span>\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {getPartLabel()}\n </span>\n {tokenCount !== null && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {tokenCount} tokens\n </Badge>\n )}\n {/* Multi-dimension badges */}\n {dimensionBadges ? dimensionBadges.map(({ dimName, component: comp, colors }) => {\n const { classes, style } = getComponentBadgeStyles(comp, colors);\n return (\n <Badge\n key={dimName}\n variant=\"outline\"\n className={cn(\n \"text-xs font-medium border\",\n classes,\n onComponentClick && \"cursor-pointer hover:opacity-80 transition-opacity\"\n )}\n style={style || undefined}\n onClick={(e) => {\n if (onComponentClick) {\n e.stopPropagation();\n onComponentClick(comp);\n }\n }}\n >\n <span className=\"text-muted-foreground\">{dimName}:</span> {comp}\n </Badge>\n );\n }) : component && (() => {\n const { classes, style } = getComponentBadgeStyles(component, componentColors);\n return (\n <Badge\n variant=\"outline\"\n className={cn(\n \"text-xs font-medium border\",\n classes,\n onComponentClick && \"cursor-pointer hover:opacity-80 transition-opacity\"\n )}\n style={style || undefined}\n onClick={(e) => {\n if (onComponentClick) {\n e.stopPropagation();\n onComponentClick(component);\n }\n }}\n >\n {component}\n </Badge>\n );\n })()}"
}
}
]
},
{
"id": "464",
"role": "tool",
"timestamp": "2026-03-09T18:43:35.062Z",
"parts": [
{
"id": "465",
"type": "tool-result",
"token_count": 28,
"component": "ui_changes",
"toolCallId": "toolu_01P32vzR7LRwT5Zauw2zN1Ep",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/MessagePartView.tsx has been updated successfully."
}
]
},
{
"id": "468",
"role": "assistant",
"timestamp": "2026-03-09T18:43:38.678Z",
"parts": [
{
"id": "466",
"type": "text",
"token_count": 20,
"component": "understanding_codebase",
"text": "Now I need to pass dimensions through MessageView to MessagePartView. Let me check MessageView:"
},
{
"id": "467",
"type": "tool-call",
"token_count": 44,
"component": "understanding_codebase",
"toolCallId": "toolu_019MKn9LZEGxAvaACMgwfdfk",
"toolName": "Grep",
"input": {
"pattern": "componentMapping|MessagePartView",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "469",
"role": "tool",
"timestamp": "2026-03-09T18:43:39.411Z",
"parts": [
{
"id": "470",
"type": "tool-result",
"token_count": 93,
"component": "understanding_codebase",
"toolCallId": "toolu_019MKn9LZEGxAvaACMgwfdfk",
"toolName": "Grep",
"output": "9:import { MessagePartView } from \"./MessagePartView\";\n17: componentMapping?: Record<string, string>;\n49:export function MessageView({ message, index, isExpanded = false, componentMapping, componentColors, onComponentClick, sourceInfo, messageSourceMap, conversationStartTime }: MessageViewProps) {\n155: <MessagePartView\n159: componentMapping={componentMapping}"
}
]
},
{
"id": "472",
"role": "assistant",
"timestamp": "2026-03-09T18:43:45.465Z",
"parts": [
{
"id": "471",
"type": "tool-call",
"token_count": 33,
"component": "understanding_codebase",
"toolCallId": "toolu_01RSZiZrXS1TgyQMS7eVV39v",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx",
"limit": 30,
"offset": 10
}
}
]
},
{
"id": "473",
"role": "tool",
"timestamp": "2026-03-09T18:43:45.533Z",
"parts": [
{
"id": "474",
"type": "tool-result",
"token_count": 388,
"component": "understanding_codebase",
"toolCallId": "toolu_01RSZiZrXS1TgyQMS7eVV39v",
"toolName": "Read",
"output": " 10→import type { Message, SourceInfo } from \"@/schema\";\n 11→import { cn } from \"@/lib/utils\";\n 12→\n 13→interface MessageViewProps {\n 14→ message: Message;\n 15→ index: number;\n 16→ isExpanded?: boolean;\n 17→ componentMapping?: Record<string, string>;\n 18→ componentColors?: Record<string, string>;\n 19→ onComponentClick?: (component: string) => void;\n 20→ // For grouped conversations\n 21→ sourceInfo?: SourceInfo;\n 22→ messageSourceMap?: Record<string, SourceInfo>;\n 23→ // For relative time display\n 24→ conversationStartTime?: Date;\n 25→}\n 26→\n 27→/**\n 28→ * Format relative time from conversation start\n 29→ */\n 30→function formatRelativeTime(startTime: Date, messageTime: Date): string {\n 31→ const diffMs = messageTime.getTime() - startTime.getTime();\n 32→ if (diffMs < 0) return \"+0s\";\n 33→\n 34→ const seconds = Math.floor(diffMs / 1000);\n 35→ const minutes = Math.floor(seconds / 60);\n 36→ const hours = Math.floor(minutes / 60);\n 37→\n 38→ if (hours > 0) {\n 39→ const remainingMinutes = minutes % 60;"
}
]
},
{
"id": "476",
"role": "assistant",
"timestamp": "2026-03-09T18:43:51.924Z",
"parts": [
{
"id": "475",
"type": "tool-call",
"token_count": 348,
"component": "ui_changes",
"toolCallId": "toolu_01FsQXtBNSa5fLtiBx7mPhA3",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx",
"old_string": "import type { Message, SourceInfo } from \"@/schema\";\nimport { cn } from \"@/lib/utils\";\n\ninterface MessageViewProps {\n message: Message;\n index: number;\n isExpanded?: boolean;\n componentMapping?: Record<string, string>;\n componentColors?: Record<string, string>;\n onComponentClick?: (component: string) => void;\n // For grouped conversations\n sourceInfo?: SourceInfo;\n messageSourceMap?: Record<string, SourceInfo>;\n // For relative time display\n conversationStartTime?: Date;\n}",
"new_string": "import type { Message, SourceInfo } from \"@/schema\";\nimport type { DimensionData } from \"@/componentisation\";\nimport { cn } from \"@/lib/utils\";\n\ninterface MessageViewProps {\n message: Message;\n index: number;\n isExpanded?: boolean;\n componentMapping?: Record<string, string>;\n componentColors?: Record<string, string>;\n onComponentClick?: (component: string) => void;\n // For grouped conversations\n sourceInfo?: SourceInfo;\n messageSourceMap?: Record<string, SourceInfo>;\n // For relative time display\n conversationStartTime?: Date;\n // Multi-dimension support\n dimensions?: Record<string, DimensionData>;\n activeDimensions?: Set<string>;\n}"
}
}
]
},
{
"id": "477",
"role": "tool",
"timestamp": "2026-03-09T18:43:52.005Z",
"parts": [
{
"id": "478",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01FsQXtBNSa5fLtiBx7mPhA3",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx has been updated successfully."
}
]
},
{
"id": "480",
"role": "assistant",
"timestamp": "2026-03-09T18:43:57.325Z",
"parts": [
{
"id": "479",
"type": "tool-call",
"token_count": 123,
"component": "ui_changes",
"toolCallId": "toolu_01Mecmy25DxrTRd3ZKmxrsZa",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx",
"old_string": "export function MessageView({ message, index, isExpanded = false, componentMapping, componentColors, onComponentClick, sourceInfo, messageSourceMap, conversationStartTime }: MessageViewProps) {",
"new_string": "export function MessageView({ message, index, isExpanded = false, componentMapping, componentColors, onComponentClick, sourceInfo, messageSourceMap, conversationStartTime, dimensions, activeDimensions }: MessageViewProps) {"
}
}
]
},
{
"id": "481",
"role": "tool",
"timestamp": "2026-03-09T18:43:57.410Z",
"parts": [
{
"id": "482",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01Mecmy25DxrTRd3ZKmxrsZa",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx has been updated successfully."
}
]
},
{
"id": "485",
"role": "assistant",
"timestamp": "2026-03-09T18:44:01.914Z",
"parts": [
{
"id": "483",
"type": "text",
"token_count": 15,
"component": "ui_changes",
"text": "Now find where MessagePartView is rendered in MessageView and pass dimensions:"
},
{
"id": "484",
"type": "tool-call",
"token_count": 33,
"component": "ui_changes",
"toolCallId": "toolu_01Rx8jWvcv7N8GNqMGS51SZt",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx",
"limit": 15,
"offset": 153
}
}
]
},
{
"id": "486",
"role": "tool",
"timestamp": "2026-03-09T18:44:02.372Z",
"parts": [
{
"id": "487",
"type": "tool-result",
"token_count": 193,
"component": "ui_changes",
"toolCallId": "toolu_01Rx8jWvcv7N8GNqMGS51SZt",
"toolName": "Read",
"output": " 153→ </span>\n 154→ )}\n 155→ </CollapsibleTrigger>\n 156→ <CollapsibleContent className=\"p-3 pt-0\">\n 157→ <div className=\"space-y-2 mt-2\">\n 158→ {message.parts.map((part, partIndex) => (\n 159→ <MessagePartView\n 160→ key={partIndex}\n 161→ part={part}\n 162→ isExpanded={isOpen}\n 163→ componentMapping={componentMapping}\n 164→ componentColors={componentColors}\n 165→ onComponentClick={onComponentClick}\n 166→ sourceInfo={messageSourceMap?.[part.id]}\n 167→ />"
}
]
},
{
"id": "489",
"role": "assistant",
"timestamp": "2026-03-09T18:44:07.518Z",
"parts": [
{
"id": "488",
"type": "tool-call",
"token_count": 190,
"component": "ui_changes",
"toolCallId": "toolu_01NSdBnPL1LxYfLoC4n3UWuF",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx",
"old_string": " <MessagePartView\n key={partIndex}\n part={part}\n isExpanded={isOpen}\n componentMapping={componentMapping}\n componentColors={componentColors}\n onComponentClick={onComponentClick}\n sourceInfo={messageSourceMap?.[part.id]}\n />",
"new_string": " <MessagePartView\n key={partIndex}\n part={part}\n isExpanded={isOpen}\n componentMapping={componentMapping}\n componentColors={componentColors}\n onComponentClick={onComponentClick}\n sourceInfo={messageSourceMap?.[part.id]}\n dimensions={dimensions}\n activeDimensions={activeDimensions}\n />"
}
}
]
},
{
"id": "490",
"role": "tool",
"timestamp": "2026-03-09T18:44:07.597Z",
"parts": [
{
"id": "491",
"type": "tool-result",
"token_count": 27,
"component": "ui_changes",
"toolCallId": "toolu_01NSdBnPL1LxYfLoC4n3UWuF",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/MessageView.tsx has been updated successfully."
}
]
},
{
"id": "494",
"role": "assistant",
"timestamp": "2026-03-09T18:44:11.423Z",
"parts": [
{
"id": "492",
"type": "text",
"token_count": 19,
"component": "workflow_refactor",
"text": "Now pass dimensions from ConversationView to MessageView. Let me find where MessageView is rendered:"
},
{
"id": "493",
"type": "tool-call",
"token_count": 41,
"component": "understanding_codebase",
"toolCallId": "toolu_01Wdne44wNcAScbyLc1oUxhk",
"toolName": "Grep",
"input": {
"pattern": "<MessageView",
"path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"output_mode": "content",
"-n": true
}
}
]
},
{
"id": "495",
"role": "tool",
"timestamp": "2026-03-09T18:44:12.128Z",
"parts": [
{
"id": "496",
"type": "tool-result",
"token_count": 11,
"component": "understanding_codebase",
"toolCallId": "toolu_01Wdne44wNcAScbyLc1oUxhk",
"toolName": "Grep",
"output": "1054: <MessageView"
}
]
},
{
"id": "498",
"role": "assistant",
"timestamp": "2026-03-09T18:44:17.135Z",
"parts": [
{
"id": "497",
"type": "tool-call",
"token_count": 34,
"component": "understanding_codebase",
"toolCallId": "toolu_01LWA6MEJ3ZcZ2Sof1YQJg7p",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"limit": 15,
"offset": 1054
}
}
]
},
{
"id": "499",
"role": "tool",
"timestamp": "2026-03-09T18:44:17.198Z",
"parts": [
{
"id": "500",
"type": "tool-result",
"token_count": 200,
"component": "understanding_codebase",
"toolCallId": "toolu_01LWA6MEJ3ZcZ2Sof1YQJg7p",
"toolName": "Read",
"output": " 1054→ <MessageView\n 1055→ key={originalIndex}\n 1056→ message={message as Message}\n 1057→ index={originalIndex}\n 1058→ isExpanded={expandAll}\n 1059→ componentMapping={componentMapping}\n 1060→ componentColors={componentColors}\n 1061→ onComponentClick={handleComponentClick}\n 1062→ sourceInfo={isGrouped ? messageSourceMap?.[message.id] : undefined}\n 1063→ messageSourceMap={isGrouped ? messageSourceMap : undefined}\n 1064→ conversationStartTime={conversationStartTime}\n 1065→ />\n 1066→ ))}\n 1067→ </div>\n 1068→ </ScrollArea>"
}
]
},
{
"id": "502",
"role": "assistant",
"timestamp": "2026-03-09T18:44:23.463Z",
"parts": [
{
"id": "501",
"type": "tool-call",
"token_count": 266,
"component": "workflow_refactor",
"toolCallId": "toolu_01VjUKv3nCSCnMKW31JWptkR",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx",
"old_string": " <MessageView\n key={originalIndex}\n message={message as Message}\n index={originalIndex}\n isExpanded={expandAll}\n componentMapping={componentMapping}\n componentColors={componentColors}\n onComponentClick={handleComponentClick}\n sourceInfo={isGrouped ? messageSourceMap?.[message.id] : undefined}\n messageSourceMap={isGrouped ? messageSourceMap : undefined}\n conversationStartTime={conversationStartTime}\n />",
"new_string": " <MessageView\n key={originalIndex}\n message={message as Message}\n index={originalIndex}\n isExpanded={expandAll}\n componentMapping={componentMapping}\n componentColors={componentColors}\n onComponentClick={handleComponentClick}\n sourceInfo={isGrouped ? messageSourceMap?.[message.id] : undefined}\n messageSourceMap={isGrouped ? messageSourceMap : undefined}\n conversationStartTime={conversationStartTime}\n dimensions={dimensions}\n activeDimensions={activeDimensions}\n />"
}
}
]
},
{
"id": "503",
"role": "tool",
"timestamp": "2026-03-09T18:44:23.550Z",
"parts": [
{
"id": "504",
"type": "tool-result",
"token_count": 27,
"component": "workflow_refactor",
"toolCallId": "toolu_01VjUKv3nCSCnMKW31JWptkR",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/components/ConversationView.tsx has been updated successfully."
}
]
},
{
"id": "507",
"role": "assistant",
"timestamp": "2026-03-09T18:44:29.101Z",
"parts": [
{
"id": "505",
"type": "text",
"token_count": 8,
"component": "tests_and_build",
"text": "Let me verify the build still works:"
},
{
"id": "506",
"type": "tool-call",
"token_count": 28,
"component": "tests_and_build",
"toolCallId": "toolu_012xkqH3wu1ztB4Ds8fsL7Pr",
"toolName": "Bash",
"input": {
"command": "npx vite build 2>&1 | tail -5",
"description": "Verify build",
"timeout": 60000
}
}
]
},
{
"id": "508",
"role": "tool",
"timestamp": "2026-03-09T18:44:36.201Z",
"parts": [
{
"id": "509",
"type": "tool-result",
"token_count": 87,
"component": "tests_and_build",
"toolCallId": "toolu_012xkqH3wu1ztB4Ds8fsL7Pr",
"toolName": "Bash",
"output": "(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n✓ built in 5.40s"
}
]
},
{
"id": "512",
"role": "assistant",
"timestamp": "2026-03-09T18:44:40.363Z",
"parts": [
{
"id": "510",
"type": "text",
"token_count": 19,
"component": "workflow_refactor",
"text": "Build succeeds. Let me also update the `StackedBarChartView` to accept dimensions:"
},
{
"id": "511",
"type": "tool-call",
"token_count": 32,
"component": "understanding_codebase",
"toolCallId": "toolu_01L4PFdm7MQUCT2KMEzn1Veq",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/components/StackedBarChartView.tsx",
"limit": 50
}
}
]
},
{
"id": "513",
"role": "tool",
"timestamp": "2026-03-09T18:44:40.888Z",
"parts": [
{
"id": "514",
"type": "tool-result",
"token_count": 755,
"component": "understanding_codebase",
"toolCallId": "toolu_01L4PFdm7MQUCT2KMEzn1Veq",
"toolName": "Read",
"output": " 1→import { useState } from \"react\";\n 2→import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from \"recharts\";\n 3→import { ScrollArea } from \"@/components/ui/scroll-area\";\n 4→import { Card } from \"@/components/ui/card\";\n 5→import { Badge } from \"@/components/ui/badge\";\n 6→import { getComponentColorHex } from \"@/lib/component-colors\";\n 7→import { MessagePartView } from \"./MessagePartView\";\n 8→import type { Conversation } from \"@/schema\";\n 9→import type { ComponentTimelineSnapshot } from \"@/componentisation\";\n 10→\n 11→// Message type filter in format \"role:type\" (e.g., \"assistant:tool-call\")\n 12→type MessageTypeFilter = string;\n 13→\n 14→interface StackedBarChartViewProps {\n 15→ componentMapping?: Record<string, string>;\n 16→ conversation: Conversation;\n 17→ componentTimeline?: ComponentTimelineSnapshot[];\n 18→ componentColors?: Record<string, string>;\n 19→ components?: string[];\n 20→ // Filters from conversation view\n 21→ messageTypeFilters?: Set<MessageTypeFilter>;\n 22→}\n 23→\n 24→export function StackedBarChartView({\n 25→ componentMapping,\n 26→ conversation,\n 27→ componentTimeline,\n 28→ componentColors,\n 29→ components,\n 30→ messageTypeFilters,\n 31→}: StackedBarChartViewProps) {\n 32→ // Track selected component for filtering\n 33→ const [selectedComponent, setSelectedComponent] = useState<string | null>(null);\n 34→ // Track hovered message for table display\n 35→ const [hoveredMessageIndex, setHoveredMessageIndex] = useState<number | null>(null);\n 36→ // Track pinned message (when user clicks a bar)\n 37→ const [pinnedMessageIndex, setPinnedMessageIndex] = useState<number | null>(null);\n 38→\n 39→ // Helper to check if a part passes the message type filter\n 40→ const partPassesFilter = (part: { type: string }, msgRole: string): boolean => {\n 41→ if (!messageTypeFilters || messageTypeFilters.has(\"all\")) return true;\n 42→ const filterKey = `${msgRole}:${part.type}`;\n 43→ return messageTypeFilters.has(filterKey);\n 44→ };\n 45→\n 46→ // Check if filters are active\n 47→ const hasActiveFilters = messageTypeFilters && !messageTypeFilters.has(\"all\") && messageTypeFilters.size > 0;\n 48→\n 49→ if (!componentMapping || Object.keys(componentMapping).length === 0) {\n 50→ return ("
}
]
},
{
"id": "517",
"role": "assistant",
"timestamp": "2026-03-09T18:44:50.357Z",
"parts": [
{
"id": "515",
"type": "text",
"token_count": 158,
"component": "ui_changes",
"text": "The StackedBarChartView uses `componentMapping` and `componentColors` directly. It doesn't need dimension awareness for the initial implementation — it shows the active dimension's data via the legacy fields. This is fine for now.\n\n### Step 14: Update the ConversationList sidebar to show dimension-aware editing\n\nThe ConversationList sidebar already has `onEditPrompt` which calls `handleOpenPromptEditor`. Since I've already updated `handleOpenPromptEditor` to accept a dimension name, the sidebar \"Edit prompt\" link works for the default dimension. \n\nFor the dimension accordion UI, that's in `ComponentsView` now. The sidebar's \"Edit prompt\" link edits the default dimension's prompt.\n\nLet me now make sure the dimension-aware prompt editor dialog shows which dimension is being edited:"
},
{
"id": "516",
"type": "tool-call",
"token_count": 31,
"component": "understanding_codebase",
"toolCallId": "toolu_01PXFvKUzoSYf8qaLgxPSpLW",
"toolName": "Read",
"input": {
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"limit": 20,
"offset": 3283
}
}
]
},
{
"id": "518",
"role": "tool",
"timestamp": "2026-03-09T18:44:51.042Z",
"parts": [
{
"id": "519",
"type": "tool-result",
"token_count": 265,
"component": "understanding_codebase",
"toolCallId": "toolu_01PXFvKUzoSYf8qaLgxPSpLW",
"toolName": "Read",
"output": " 3283→ />\n 3284→ )}\n 3285→ </aside>\n 3286→ </div>\n 3287→ )}\n 3288→ </div>\n 3289→\n 3290→ {/* Prompt Editor Dialogs */}\n 3291→ <PromptEditorDialog\n 3292→ open={isPromptDialogOpen}\n 3293→ onOpenChange={setIsPromptDialogOpen}\n 3294→ title=\"Edit Component Identification Prompt\"\n 3295→ description=\"Customize the prompt used to identify components in the conversation. The AI will use this prompt to analyze the conversation and identify logical components.\"\n 3296→ value={editingPrompt}\n 3297→ onChange={setEditingPrompt}\n 3298→ onApply={handleApplyPrompt}\n 3299→ placeholder=\"Enter your componentisation prompt...\"\n 3300→ warningText=\"This will re-run componentisation, visualization, and analysis\"\n 3301→ />\n 3302→"
}
]
},
{
"id": "521",
"role": "assistant",
"timestamp": "2026-03-09T18:44:58.962Z",
"parts": [
{
"id": "520",
"type": "tool-call",
"token_count": 341,
"component": "ui_changes",
"toolCallId": "toolu_014KXi83GGuKxC5YX4UKxFDP",
"toolName": "Edit",
"input": {
"replace_all": false,
"file_path": "/Users/srihari/work/nilenso/context-viewer/src/App.tsx",
"old_string": " <PromptEditorDialog\n open={isPromptDialogOpen}\n onOpenChange={setIsPromptDialogOpen}\n title=\"Edit Component Identification Prompt\"\n description=\"Customize the prompt used to identify components in the conversation. The AI will use this prompt to analyze the conversation and identify logical components.\"\n value={editingPrompt}\n onChange={setEditingPrompt}\n onApply={handleApplyPrompt}\n placeholder=\"Enter your componentisation prompt...\"\n warningText=\"This will re-run componentisation, visualization, and analysis\"\n />",
"new_string": " <PromptEditorDialog\n open={isPromptDialogOpen}\n onOpenChange={setIsPromptDialogOpen}\n title={`Edit Component Identification Prompt${editingDimensionName && editingDimensionName !== \"default\" ? ` (${editingDimensionName})` : \"\"}`}\n description=\"Customize the prompt used to identify components in the conversation. The AI will use this prompt to analyze the conversation and identify logical components.\"\n value={editingPrompt}\n onChange={setEditingPrompt}\n onApply={handleApplyPrompt}\n placeholder=\"Enter your componentisation prompt...\"\n warningText={editingDimensionName && editingDimensionName !== \"default\"\n ? `This will re-run componentisation for the \"${editingDimensionName}\" dimension`\n : \"This will re-run componentisation, visualization, and analysis\"\n }\n />"
}
}
]
},
{
"id": "522",
"role": "tool",
"timestamp": "2026-03-09T18:44:59.038Z",
"parts": [
{
"id": "523",
"type": "tool-result",
"token_count": 24,
"component": "ui_changes",
"toolCallId": "toolu_014KXi83GGuKxC5YX4UKxFDP",
"toolName": "Edit",
"output": "The file /Users/srihari/work/nilenso/context-viewer/src/App.tsx has been updated successfully."
}
]
},
{
"id": "526",
"role": "assistant",
"timestamp": "2026-03-09T18:45:03.568Z",
"parts": [
{
"id": "524",
"type": "text",
"token_count": 8,
"component": "tests_and_build",
"text": "### Step 15: Final build verification"
},
{
"id": "525",
"type": "tool-call",
"token_count": 29,
"component": "tests_and_build",
"toolCallId": "toolu_01CTT4aMxjw4b8EMLHXLeit2",
"toolName": "Bash",
"input": {
"command": "npx vite build 2>&1 | tail -5",
"description": "Final build verification",
"timeout": 60000
}
}
]
},
{
"id": "527",
"role": "tool",
"timestamp": "2026-03-09T18:45:09.763Z",
"parts": [
{
"id": "528",
"type": "tool-result",
"token_count": 87,
"component": "tests_and_build",
"toolCallId": "toolu_01CTT4aMxjw4b8EMLHXLeit2",
"toolName": "Bash",
"output": "(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n✓ built in 5.22s"
}
]
},
{
"id": "531",
"role": "assistant",
"timestamp": "2026-03-09T18:45:14.859Z",
"parts": [
{
"id": "529",
"type": "text",
"token_count": 18,
"component": "task_management",
"text": "Build succeeds. Let me do a quick summary of all changes and verify the file diff:"
},
{
"id": "530",
"type": "tool-call",
"token_count": 17,
"component": "task_management",
"toolCallId": "toolu_01G7NggJPeLfLnHaRs4ZEQuE",
"toolName": "Bash",
"input": {
"command": "git diff --stat",
"description": "Show changed files summary"
}
}
]
},
{
"id": "532",
"role": "tool",
"timestamp": "2026-03-09T18:45:15.651Z",
"parts": [
{
"id": "533",
"type": "tool-result",
"token_count": 198,
"component": "task_management",
"toolCallId": "toolu_01G7NggJPeLfLnHaRs4ZEQuE",
"toolName": "Bash",
"output": " .claude/settings.local.json | 82 ++++++-\n docs/prompts.md | 98 ++++++--\n src/App.tsx | 364 ++++++++++++++++++++++++---\n src/componentisation.ts | 15 ++\n src/components/ComponentComparisonView.tsx | 5 +\n src/components/ComponentsView.tsx | 381 ++++++++++++++++++++++++++---\n src/components/ConversationView.tsx | 27 +-\n src/components/MessagePartView.tsx | 42 +++-\n src/components/MessageView.tsx | 8 +-\n src/lib/component-colors.ts | 41 ++++\n src/prompts.ts | 4 +-\n src/segmentation.ts | 2 +-\n 12 files changed, 968 insertions(+), 101 deletions(-)"
}
]
},
{
"id": "535",
"role": "assistant",
"timestamp": "2026-03-09T18:45:33.419Z",
"parts": [
{
"id": "534.1",
"type": "text",
"token_count": 7,
"component": "task_management",
"text": "Here's a summary of everything implemented:"
},
{
"id": "534.2",
"type": "text",
"token_count": 4,
"component": "task_management",
"text": "## Summary of Changes"
},
{
"id": "534.3",
"type": "text",
"token_count": 47,
"component": "workflow_refactor",
"text": "### Data Model (`src/componentisation.ts`)\n- Added `DimensionData` interface — represents one dimension of componentisation with its own `name`, `prompt`, `components`, `componentMapping`, `componentTimeline`, `componentColors`"
},
{
"id": "534.4",
"type": "text",
"token_count": 48,
"component": "workflow_refactor",
"text": "### Color Blending (`src/lib/component-colors.ts`)\n- Added `blendColors()` — averages RGB components of multiple hex colors\n- Added `getBlendedColorForPart()` — resolves a blended color for a part across active dimensions"
},
{
"id": "534.5",
"type": "text",
"token_count": 184,
"component": "workflow_refactor",
"text": "### State & Pipeline (`src/App.tsx`)\n- Added `dimensions` and `targetDimension` to `WorkflowState`\n- Added dimension helper functions: `syncLegacyFieldsFromDimensions()`, `ensureDimensions()`, `getDimensionNames()`\n- Updated `findComponentsActivity` to process all dimensions in parallel (or just `targetDimension` if set)\n- Updated `assignColorsActivity` to assign colors per dimension in parallel\n- Updated all workflow runner methods to propagate `dimensions` through state\n- Added `activeDimensions` state and `editingDimensionName` tracking\n- Added dimension management handlers: `handleAddDimension`, `handleRemoveDimension`, `handleRenameDimension`, `handleEditDimensionPrompt`, `handleApplyDimensionPrompt`\n- Made `handleOpenPromptEditor` and `handleApplyPrompt` dimension-aware\n- Passes `dimensions`, `activeDimensions`, and dimension management callbacks to ConversationView"
},
{
"id": "534.6",
"type": "text",
"token_count": 104,
"component": "ui_changes",
"text": "### ComponentsView (`src/components/ComponentsView.tsx`)\n- Complete rewrite with dimension management accordion:\n - Checkbox per dimension to activate/deactivate\n - Expandable sections showing each dimension's components with color swatches\n - Add, rename, delete dimension actions\n - Edit prompt button per dimension\n- When single dimension active: shows waffle chart + timeline as before\n- When multiple dimensions active: shows per-dimension waffle charts side by side\n- Blended color support for multi-dimension workflow diagram"
},
{
"id": "534.7",
"type": "text",
"token_count": 45,
"component": "ui_changes",
"text": "### ConversationView (`src/components/ConversationView.tsx`)\n- New props: `dimensions`, `activeDimensions`, `onActiveDimensionsChange`, and dimension management callbacks\n- Passes dimension props to ComponentsView and MessageView"
},
{
"id": "534.8",
"type": "text",
"token_count": 46,
"component": "ui_changes",
"text": "### MessageView & MessagePartView\n- Accept `dimensions` and `activeDimensions` props\n- When multiple dimensions active, show multiple component badges per part (e.g., \"default: foo\", \"intent: bar\")"
},
{
"id": "534.9",
"type": "text",
"token_count": 25,
"component": "workflow_refactor",
"text": "### ComponentComparisonView\n- Extended `ConversationComponentData` with optional `dimensionData` field for future multi-dimension comparison"
},
{
"id": "534.10",
"type": "text",
"token_count": 77,
"component": "workflow_refactor",
"text": "### Key behaviors:\n- **Backward compatible** — single \"default\" dimension works exactly as before\n- **Per-dimension LLM calls** — each dimension runs its own identify → map → color pipeline independently\n- **Selective reprocessing** — editing a dimension's prompt only reruns that dimension\n- **Parallel processing** — multiple dimensions are processed concurrently via `Promise.all`"
}
]
},
{
"id": "536",
"role": "user",
"timestamp": "2026-03-09T18:54:40.598Z",
"parts": [
{
"id": "537",
"type": "text",
"token_count": 17,
"component": "task_management",
"text": "commit what we have so far as a first cut. there's many things to fix."
}
]
},
{
"id": "541",
"role": "assistant",
"timestamp": "2026-03-09T18:54:45.373Z",
"parts": [
{
"id": "538",
"type": "tool-call",
"token_count": 15,
"component": "task_management",
"toolCallId": "toolu_01Ejo7ZttM2K3nqbozzPRCqf",
"toolName": "Bash",
"input": {
"command": "git status",
"description": "Show working tree status"
}
},
{
"id": "539",
"type": "tool-call",
"token_count": 17,
"component": "workflow_refactor",
"toolCallId": "toolu_01DtSycKh3EmTHR4Q6DoS6eW",
"toolName": "Bash",
"input": {
"command": "git diff --staged",
"description": "Check staged changes"
}
},
{
"id": "540",
"type": "tool-call",
"token_count": 19,
"component": "workflow_refactor",
"toolCallId": "toolu_01TKJVfXQcXrcDAKs5TwLaAU",
"toolName": "Bash",
"input": {
"command": "git log --oneline -5",
"description": "Show recent commits"
}
}
]
},
{
"id": "542",
"role": "tool",
"timestamp": "2026-03-09T18:54:45.511Z",
"parts": [
{
"id": "543",
"type": "tool-result",
"token_count": 204,
"component": "workflow_refactor",
"toolCallId": "toolu_01Ejo7ZttM2K3nqbozzPRCqf",
"toolName": "Bash",
"output": "On branch multiple-components\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\tmodified: .claude/settings.local.json\n\tmodified: docs/prompts.md\n\tmodified: src/App.tsx\n\tmodified: src/componentisation.ts\n\tmodified: src/components/ComponentComparisonView.tsx\n\tmodified: src/components/ComponentsView.tsx\n\tmodified: src/components/ConversationView.tsx\n\tmodified: src/components/MessagePartView.tsx\n\tmodified: src/components/MessageView.tsx\n\tmodified: src/lib/component-colors.ts\n\tmodified: src/prompts.ts\n\tmodified: src/segmentation.ts\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")"
}
]
},
{
"id": "544",
"role": "tool",
"timestamp": "2026-03-09T18:54:45.911Z",
"parts": [
{
"id": "545",
"type": "tool-result",
"token_count": 3,
"component": "workflow_refactor",
"toolCallId": "toolu_01DtSycKh3EmTHR4Q6DoS6eW",
"toolName": "Bash",
"output": ""
}
]
},
{
"id": "546",
"role": "tool",
"timestamp": "2026-03-09T18:54:46.052Z",
"parts": [
{
"id": "547",
"type": "tool-result",
"token_count": 76,
"component": "workflow_refactor",
"toolCallId": "toolu_01TKJVfXQcXrcDAKs5TwLaAU",
"toolName": "Bash",
"output": "f355ab0 Add component descriptions to prompt\nefc8f1b Add some general purpose docs, this is mostly slop. I need to clean this up\n1ef59ea Add SWE-Agent trajectory parser and .traj file support\nb7f7089 Add configurable segmentation token threshold\ncb8d96c Prompt for preset name before exporting"
}
]
},
{
"id": "549",
"role": "assistant",
"timestamp": "2026-03-09T18:54:49.474Z",
"parts": [
{
"id": "548",
"type": "tool-call",
"token_count": 69,
"component": "workflow_refactor",
"toolCallId": "toolu_01XcbLqD4YQAdvY9YJBCBBWs",
"toolName": "Bash",
"input": {
"command": "git add src/App.tsx src/componentisation.ts src/components/ComponentComparisonView.tsx src/components/ComponentsView.tsx src/components/ConversationView.tsx src/components/MessagePartView.tsx src/components/MessageView.tsx src/lib/component-colors.ts",
"description": "Stage the multi-dimension feature files"
}
}
]
},
{
"id": "550",
"role": "tool",
"timestamp": "2026-03-09T18:54:49.586Z",
"parts": [
{
"id": "551",
"type": "tool-result",
"token_count": 3,
"component": "workflow_refactor",
"toolCallId": "toolu_01XcbLqD4YQAdvY9YJBCBBWs",
"toolName": "Bash",
"output": ""
}
]
},
{
"id": "553",
"role": "assistant",
"timestamp": "2026-03-09T18:54:57.135Z",
"parts": [
{
"id": "552",
"type": "tool-call",
"token_count": 172,
"component": "workflow_refactor",
"toolCallId": "toolu_013qaANQxGFCXMHGkMtqiAyK",
"toolName": "Bash",
"input": {
"command": "git commit -m \"$(cat <<'EOF'\nAdd multi-dimensional componentisation (first cut)\n\nEach conversation can now have multiple componentisation \"dimensions\",\neach with its own prompt, components, mapping, colors, and timeline.\nThe default dimension preserves backward compatibility with existing\nsingle-dimension behavior.\n\nKey changes:\n- DimensionData type and dimensions field on WorkflowState\n- Per-dimension LLM pipeline with parallel processing\n- Color blending utilities for multi-dimension visualization\n- Dimension management UI (add/remove/rename/edit prompt)\n- Per-dimension waffle charts and multi-badge message parts\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\nEOF\n)\"",
"description": "Commit multi-dimension feature"
}
}
]
},
{
"id": "554",
"role": "tool",
"timestamp": "2026-03-09T18:54:57.263Z",
"parts": [
{
"id": "555",
"type": "tool-result",
"token_count": 38,
"component": "workflow_refactor",
"toolCallId": "toolu_013qaANQxGFCXMHGkMtqiAyK",
"toolName": "Bash",
"output": "[multiple-components fbb0d70] Add multi-dimensional componentisation (first cut)\n 8 files changed, 811 insertions(+), 72 deletions(-)"
}
]
},
{
"id": "557",
"role": "assistant",
"timestamp": "2026-03-09T18:55:00.373Z",
"parts": [
{
"id": "556",
"type": "text",
"token_count": 52,
"component": "task_management",
"text": "Committed as `fbb0d70`. The unstaged files (`docs/prompts.md`, `src/prompts.ts`, `src/segmentation.ts`, `.claude/settings.local.json`) were left out since they appear to be separate/pre-existing changes."
}
]
},
{
"id": "560",
"role": "user",
"timestamp": "2026-03-09T18:55:54.882Z",
"parts": [
{
"id": "558",
"type": "text",
"token_count": 25,
"component": "ui_changes",
"text": "i meant adding an accordion for managing dimensions in this popup modal, in the find components section, no the main components tab."
},
{
"id": "559",
"type": "image",
"component": "ui_changes",
"image": "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YAAGYAAGYAAGYAAGYAAGYAAGYAAGYAAGYAAGYAAGYAAGYKCFdxQBARcCGIABGIABGIABGIABGIABGIABGIABGIABGIABGIABGIABGGjJQgwCgARIMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMNBSkjFAKPJBJ1CIAQzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAQAtCERBwIYABGIABGIABGIABGIABGIABGIABGIABGIABGIABGIABGICBFkYUAQEXAhiAARiAARiAARiAARiAARiAARiAARiAARiAARiAARiAARhoYeo5IOBCAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMtvKMICLgQwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwEBLFmIQACRAggEYgAEYgAEYgAEYgAEYgAEYgAEYgAEYgAEYgAEYgAEYgIGWkowBQpEPOoFCDGAABmAABmAABmAABmAABmAABmAABmAABmAABmAABmAABloQioCACwEMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMwAAMtDCiCAi4EMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMBAC1PPAQEXAhiAARiAARiAARiAARiAARiAARiAARiAARiAARiAARiAARho4R1FQMCFAAZgAAZgAAZgAAZgAAZgAAZgAAZgAAZgAAZgAAZgAAZgAAZashCDACABEgzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAAAzAAAy0lGQMEIp80AkUYgADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMNCCUAQEXAhgAAb8z0BrayuFGMAADMAADMAADMAADMAADMAADMAADMBAjhgodO6HQgxaSiwGjCjyQSdQiAEMFAcDeqPS3t4urW2tEgoGZc6c2TJ79iwKMYABGIABGIABGIABGIABGIABGIABGICBLDCguZZQKGhyLyYHg2hU8HwYpaUkYoBQ5INOoBADGPA/A23t7RIMBmXK5Mkye/Zs2Xa77WTX3XaXPfbci0IMYAAGYAAGYAAGYAAGYAAGYAAGYAAGYCALDGiuZdvttpXZs2abHEwwFDI5mULnhSjEoKWLxwChyAedQCEG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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment