claude-code-workflow 7.2.27 → 7.2.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ccw/specs/architecture-constraints.md +5 -0
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
- package/.claude/skills/investigate/SKILL.md +110 -0
- package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
- package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
- package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
- package/.claude/skills/investigate/phases/04-implementation.md +139 -0
- package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
- package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
- package/.claude/skills/investigate/specs/iron-law.md +101 -0
- package/.claude/skills/security-audit/SKILL.md +125 -0
- package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
- package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
- package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
- package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
- package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
- package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
- package/.claude/skills/ship/SKILL.md +105 -0
- package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
- package/.claude/skills/ship/phases/02-code-review.md +137 -0
- package/.claude/skills/ship/phases/03-version-bump.md +171 -0
- package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
- package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
- package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
- package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
- package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.claude/skills/team-motion-design/SKILL.md +129 -0
- package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
- package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
- package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
- package/.claude/skills/team-ui-polish/SKILL.md +127 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
- package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
- package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
- package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
- package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.claude/skills/team-uidesign/SKILL.md +6 -1
- package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
- package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
- package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
- package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
- package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
- package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
- package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
- package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
- package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
- package/.claude/skills/team-ux-improve/SKILL.md +3 -0
- package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
- package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
- package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
- package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
- package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
- package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
- package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
- package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
- package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
- package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
- package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
- package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
- package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/.codex/skills/investigate/agents/investigator.md +392 -0
- package/.codex/skills/investigate/orchestrator.md +362 -0
- package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
- package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
- package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
- package/.codex/skills/investigate/phases/04-implementation.md +195 -0
- package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
- package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
- package/.codex/skills/security-audit/orchestrator.md +384 -0
- package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
- package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
- package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
- package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
- package/.codex/skills/ship/agents/ship-operator.md +318 -0
- package/.codex/skills/ship/orchestrator.md +426 -0
- package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
- package/.codex/skills/ship/phases/02-code-review.md +228 -0
- package/.codex/skills/ship/phases/03-version-bump.md +259 -0
- package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
- package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
- package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
- package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
- package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.codex/skills/team-motion-design/SKILL.md +222 -0
- package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
- package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
- package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
- package/.codex/skills/team-ui-polish/SKILL.md +218 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
- package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
- package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
- package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
- package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/README.md +8 -0
- package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
- package/ccw/dist/core/hooks/hook-templates.js +114 -1
- package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +34 -0
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +2 -2
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +105 -105
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CxzXz6o1.js","sources":["../../src/components/shared/LogBlock/jsonUtils.ts","../../src/components/shared/LogBlock/JsonFormatter.tsx","../../src/components/shared/CliStreamMonitor/MessageRenderer/index.tsx"],"sourcesContent":["// ========================================\r\n// LogBlock JSON Utilities\r\n// ========================================\r\n// JSON content detection and formatting utilities\r\n\r\n/**\r\n * JSON content type detection result\r\n */\r\nexport interface JsonDetectionResult {\r\n isJson: boolean;\r\n parsed?: unknown;\r\n error?: string;\r\n format: 'object' | 'array' | 'primitive' | 'invalid';\r\n}\r\n\r\n/**\r\n * Display mode for JSON content\r\n */\r\nexport type JsonDisplayMode = 'text' | 'card' | 'inline';\r\n\r\n/**\r\n * Detect if content is valid JSON\r\n *\r\n * @param content - Content string to check\r\n * @returns Detection result with parsed data if valid\r\n */\r\nexport function detectJson(content: string): JsonDetectionResult {\r\n const trimmed = content.trim();\r\n\r\n // Quick check for JSON patterns\r\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\r\n return { isJson: false, format: 'invalid' };\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n\r\n // Determine format type\r\n let format: JsonDetectionResult['format'] = 'primitive';\r\n if (Array.isArray(parsed)) {\r\n format = 'array';\r\n } else if (parsed !== null && typeof parsed === 'object') {\r\n format = 'object';\r\n }\r\n\r\n return { isJson: true, parsed, format };\r\n } catch (error) {\r\n return {\r\n isJson: false,\r\n format: 'invalid',\r\n error: error instanceof Error ? error.message : 'Unknown parse error'\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Extract JSON from mixed content\r\n * Handles cases where JSON is embedded in text output\r\n *\r\n * @param content - Content that may contain JSON\r\n * @returns Extracted JSON string or null if not found\r\n */\r\nexport function extractJson(content: string): string | null {\r\n const trimmed = content.trim();\r\n\r\n // Direct JSON\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n // Find the matching bracket\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n let end = -1;\r\n\r\n for (let i = 0; i < trimmed.length; i++) {\r\n const char = trimmed[i];\r\n\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n inString = !inString;\r\n continue;\r\n }\r\n\r\n if (!inString) {\r\n if (char === '{' || char === '[') {\r\n depth++;\r\n } else if (char === '}' || char === ']') {\r\n depth--;\r\n if (depth === 0) {\r\n end = i + 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (end > 0) {\r\n return trimmed.substring(0, end);\r\n }\r\n }\r\n\r\n // Try to find JSON in code blocks\r\n const codeBlockMatch = content.match(/```(?:json)?\\s*\\n([\\s\\S]*?)\\n```/);\r\n if (codeBlockMatch) {\r\n return codeBlockMatch[1].trim();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Detect if content should be displayed as JSON\r\n * Combines extraction and validation\r\n *\r\n * @param content - Content to check\r\n * @returns Detection result\r\n */\r\nexport function detectJsonContent(content: string): JsonDetectionResult & { extracted: string | null } {\r\n const extracted = extractJson(content);\r\n\r\n if (!extracted) {\r\n return { isJson: false, format: 'invalid', extracted: null };\r\n }\r\n\r\n const result = detectJson(extracted);\r\n return { ...result, extracted };\r\n}\r\n\r\n/**\r\n * Format JSON for display\r\n *\r\n * @param data - Parsed JSON data\r\n * @param indent - Indentation spaces (default: 2)\r\n * @returns Formatted JSON string\r\n */\r\nexport function formatJson(data: unknown, indent: number = 2): string {\r\n return JSON.stringify(data, null, indent);\r\n}\r\n\r\n/**\r\n * Get a summary string for JSON data\r\n *\r\n * @param data - Parsed JSON data\r\n * @returns Summary description\r\n */\r\nexport function getJsonSummary(data: unknown): string {\r\n if (data === null) return 'null';\r\n if (typeof data === 'boolean') return data ? 'true' : 'false';\r\n if (typeof data === 'number') return String(data);\r\n if (typeof data === 'string') return `\"${data.length > 30 ? data.substring(0, 30) + '...' : data}\"`;\r\n\r\n if (Array.isArray(data)) {\r\n const length = data.length;\r\n return `Array[${length}]${length > 0 ? ` (${getJsonSummary(data[0])}, ...)` : ''}`;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const keys = Object.keys(data);\r\n return `Object{${keys.length}}${keys.length > 0 ? ` (${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', ...' : ''})` : ''}`;\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\n/**\r\n * Get color class for JSON value type\r\n *\r\n * @param value - JSON value\r\n * @returns Tailwind color class\r\n */\r\nexport function getJsonValueTypeColor(value: unknown): string {\r\n if (value === null) return 'text-muted-foreground';\r\n if (typeof value === 'boolean') return 'text-purple-400';\r\n if (typeof value === 'number') return 'text-orange-400';\r\n if (typeof value === 'string') return 'text-green-400';\r\n if (Array.isArray(value)) return 'text-blue-400';\r\n if (typeof value === 'object') return 'text-yellow-400';\r\n return 'text-foreground';\r\n}\r\n","// ========================================\r\n// JsonFormatter Component\r\n// ========================================\r\n// Displays JSON content in formatted text or card view\r\n\r\nimport { useState, useCallback, useMemo } from 'react';\r\nimport { ChevronDown, ChevronRight, Copy, Check, Braces } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n detectJsonContent,\r\n formatJson,\r\n getJsonSummary,\r\n getJsonValueTypeColor,\r\n type JsonDisplayMode,\r\n} from './jsonUtils';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface JsonFormatterProps {\r\n /** Content to format */\r\n content: string;\r\n /** Display mode */\r\n displayMode?: JsonDisplayMode;\r\n /** CSS className */\r\n className?: string;\r\n /** Maximum lines for text mode (default: 20) */\r\n maxLines?: number;\r\n /** Whether to show type labels in card mode (default: true) */\r\n showTypeLabels?: boolean;\r\n}\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Copy button with feedback\r\n */\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = useCallback(async () => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }, [text]);\r\n\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n className=\"h-6 px-2 text-xs opacity-0 group-hover:opacity-100 transition-opacity\"\r\n >\r\n {copied ? (\r\n <>\r\n <Check className=\"h-3 w-3 mr-1\" />\r\n Copied\r\n </>\r\n ) : (\r\n <>\r\n <Copy className=\"h-3 w-3 mr-1\" />\r\n Copy\r\n </>\r\n )}\r\n </Button>\r\n );\r\n}\r\n\r\n/**\r\n * JSON value renderer with syntax highlighting\r\n */\r\nfunction JsonValue({ value, depth = 0 }: { value: unknown; depth?: number }) {\r\n const indent = ' '.repeat(depth);\r\n const colorClass = getJsonValueTypeColor(value);\r\n\r\n if (value === null) {\r\n return <span className={colorClass}>null</span>;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return <span className={colorClass}>\"{value}\"</span>;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length === 0) {\r\n return <span className=\"text-blue-400\">[]</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-blue-400\">\r\n <span>[</span>\r\n <div className=\"pl-4\">\r\n {value.map((item, index) => (\r\n <div key={index} className=\"hover:bg-muted/50 rounded px-1\">\r\n <JsonValue value={item} depth={depth + 1} />\r\n {index < value.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}]</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value as Record<string, unknown>);\r\n if (entries.length === 0) {\r\n return <span className=\"text-yellow-400\">{`{}`}</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-yellow-400\">\r\n <span>{`{`}</span>\r\n <div className=\"pl-4\">\r\n {entries.map(([key, val], index) => (\r\n <div key={key} className=\"hover:bg-muted/50 rounded px-1\">\r\n <span className=\"text-cyan-400\">\"{key}\"</span>\r\n <span className=\"text-foreground\">: </span>\r\n <JsonValue value={val} depth={depth + 1} />\r\n {index < entries.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}{`}`}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return <span>{String(value)}</span>;\r\n}\r\n\r\n/**\r\n * Compact JSON view for inline display\r\n */\r\nfunction JsonCompact({ data }: { data: unknown }) {\r\n return (\r\n <code className=\"text-xs font-mono\">\r\n <JsonValue value={data} />\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Card view for structured JSON display\r\n */\r\nfunction JsonCard({ data, showTypeLabels = true }: { data: unknown; showTypeLabels?: boolean }) {\r\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\r\n\r\n const toggleKey = useCallback((key: string) => {\r\n setExpandedKeys((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\r\n // Primitive or array - use inline view\r\n return (\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCompact data={data} />\r\n </div>\r\n );\r\n }\r\n\r\n const entries = Object.entries(data as Record<string, unknown>);\r\n\r\n return (\r\n <div className=\"border border-border rounded-lg overflow-hidden bg-card\">\r\n {/* Header */}\r\n <div className=\"flex items-center gap-2 px-3 py-2 bg-muted/50 border-b border-border\">\r\n <Braces className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"text-sm font-medium\">JSON Data</span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n ({entries.length} {entries.length === 1 ? 'property' : 'properties'})\r\n </span>\r\n </div>\r\n\r\n {/* Properties */}\r\n <div className=\"divide-y divide-border\">\r\n {entries.map(([key, value]) => {\r\n const isObject = value !== null && typeof value === 'object';\r\n const isExpanded = expandedKeys.has(key);\r\n const isArray = Array.isArray(value);\r\n const summary = getJsonSummary(value);\r\n\r\n return (\r\n <div key={key} className=\"group\">\r\n <div\r\n className={cn(\r\n 'flex items-start gap-2 px-3 py-2 hover:bg-muted/30 transition-colors',\r\n isObject && 'cursor-pointer'\r\n )}\r\n onClick={() => isObject && toggleKey(key)}\r\n >\r\n {/* Expand/collapse icon */}\r\n {isObject && (\r\n <div className=\"shrink-0 mt-0.5\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Key */}\r\n <span className=\"font-mono text-sm text-cyan-400 shrink-0\">\"{key}\"</span>\r\n <span className=\"text-muted-foreground shrink-0\">:</span>\r\n\r\n {/* Value summary or full value */}\r\n <div className={cn('flex-1 min-w-0', getJsonValueTypeColor(value))}>\r\n {showTypeLabels && (\r\n <span className=\"text-xs text-muted-foreground mr-1\">\r\n {isArray ? 'array' : isObject ? 'object' : typeof value}\r\n </span>\r\n )}\r\n {!isObject ? (\r\n <span className=\"text-sm font-mono break-all\">{summary}</span>\r\n ) : (\r\n <span className=\"text-sm\">{summary}</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded nested object */}\r\n {isObject && isExpanded && (\r\n <div className=\"pl-8 pr-3 pb-2\">\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCard data={value} showTypeLabels={showTypeLabels} />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Text view for formatted JSON\r\n */\r\nfunction JsonText({ data, maxLines = 20 }: { data: unknown; maxLines?: number }) {\r\n const formatted = useMemo(() => formatJson(data), [data]);\r\n const lines = formatted.split('\\n');\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n const displayLines = showTruncated ? lines.slice(0, maxLines) : lines;\r\n\r\n return (\r\n <div className=\"relative group\">\r\n <pre className=\"text-xs font-mono bg-muted/30 p-3 rounded border border-border overflow-x-auto\">\r\n <code className=\"text-foreground\">\r\n {displayLines.map((line, i) => (\r\n <div key={i} className=\"hover:bg-muted/50 px-1 -mx-1\">\r\n {line}\r\n </div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </code>\r\n </pre>\r\n\r\n {/* Copy button */}\r\n <div className=\"absolute top-2 right-2\">\r\n <CopyButton text={formatted} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * JsonFormatter Component\r\n *\r\n * Displays JSON content in various formats:\r\n * - `text`: Formatted JSON text with syntax highlighting\r\n * - `card`: Structured card view with collapsible properties\r\n * - `inline`: Compact inline display\r\n *\r\n * Auto-detects JSON from mixed content and validates it.\r\n */\r\nexport function JsonFormatter({\r\n content,\r\n displayMode = 'text',\r\n className,\r\n maxLines = 20,\r\n showTypeLabels = true,\r\n}: JsonFormatterProps) {\r\n // Detect JSON content\r\n const detection = useMemo(() => detectJsonContent(content), [content]);\r\n\r\n // Not JSON or invalid - show as plain text\r\n if (!detection.isJson) {\r\n return (\r\n <div className={cn('text-xs font-mono text-foreground', className)}>\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n // Valid JSON - render based on display mode\r\n switch (displayMode) {\r\n case 'card':\r\n return (\r\n <div className={className}>\r\n <JsonCard data={detection.parsed} showTypeLabels={showTypeLabels} />\r\n </div>\r\n );\r\n\r\n case 'inline':\r\n return (\r\n <div className={cn('inline-flex items-center gap-1 px-2 py-1 bg-muted/50 rounded border border-border', className)}>\r\n <Braces className=\"h-3 w-3 text-muted-foreground shrink-0\" />\r\n <span className=\"text-xs font-mono\">\r\n <JsonCompact data={detection.parsed} />\r\n </span>\r\n </div>\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <JsonText data={detection.parsed} maxLines={maxLines} />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default JsonFormatter;\r\n","// ========================================\r\n// MessageRenderer Component\r\n// ========================================\r\n// Renders message content with Markdown support, JSON formatting,\r\n// and escape sequence handling\r\n\r\nimport { useMemo } from 'react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeHighlight from 'rehype-highlight';\r\nimport { cn } from '@/lib/utils';\r\nimport { JsonFormatter } from '../../LogBlock/JsonFormatter';\r\nimport { detectJsonContent } from '../../LogBlock/jsonUtils';\r\n\r\n// Import highlight.js styles for code syntax highlighting\r\n// Using a base style that works with both light and dark themes\r\nimport 'highlight.js/styles/base16/atelier-forest.css';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface MessageRendererProps {\r\n /** Content to render */\r\n content: string;\r\n /** Additional CSS className */\r\n className?: string;\r\n /** Format hint (auto-detect if not specified) */\r\n format?: 'markdown' | 'text' | 'json';\r\n /** Maximum lines to display (for text mode) */\r\n maxLines?: number;\r\n}\r\n\r\n// ========== Markdown Component Styles ==========\r\n\r\nconst markdownComponents: Record<string, string> = {\r\n h1: 'text-xl font-bold mt-4 mb-2 text-foreground',\r\n h2: 'text-lg font-semibold mt-3 mb-2 text-foreground',\r\n h3: 'text-base font-semibold mt-2 mb-1 text-foreground',\r\n p: 'text-sm leading-relaxed mb-2 text-foreground',\r\n ul: 'list-disc list-inside mb-2 text-sm space-y-1',\r\n ol: 'list-decimal list-inside mb-2 text-sm space-y-1',\r\n li: 'text-sm text-foreground',\r\n code: 'font-mono text-xs bg-muted px-1.5 py-0.5 rounded text-amber-600 dark:text-amber-400',\r\n pre: 'bg-muted/80 dark:bg-muted/30 p-3 rounded-lg overflow-x-auto my-2 border border-border/50',\r\n blockquote: 'border-l-4 border-muted-foreground pl-4 italic text-muted-foreground my-2',\r\n strong: 'font-semibold text-foreground',\r\n a: 'text-blue-600 dark:text-blue-400 hover:underline',\r\n};\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Inline code renderer for Markdown\r\n */\r\nfunction MarkdownCode({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <code\r\n className={cn(markdownComponents.code, className)}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Code block renderer for Markdown with syntax highlighting\r\n */\r\nfunction MarkdownPre({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <pre\r\n className={cn(markdownComponents.pre, className)}\r\n {...props}\r\n >\r\n {children}\r\n </pre>\r\n );\r\n}\r\n\r\n/**\r\n * Paragraph renderer for Markdown\r\n */\r\nfunction MarkdownParagraph({ className, children, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p\r\n className={cn(markdownComponents.p, className)}\r\n {...props}\r\n >\r\n {children}\r\n </p>\r\n );\r\n}\r\n\r\n/**\r\n * Heading renderers for Markdown\r\n */\r\nfunction MarkdownH1({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h1\r\n className={cn(markdownComponents.h1, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h1>\r\n );\r\n}\r\n\r\nfunction MarkdownH2({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h2\r\n className={cn(markdownComponents.h2, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h2>\r\n );\r\n}\r\n\r\nfunction MarkdownH3({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h3\r\n className={cn(markdownComponents.h3, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h3>\r\n );\r\n}\r\n\r\n/**\r\n * List renderers for Markdown\r\n */\r\nfunction MarkdownUl({ className, children, ...props }: React.HTMLAttributes<HTMLUListElement>) {\r\n return (\r\n <ul\r\n className={cn(markdownComponents.ul, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction MarkdownOl({ className, children, ...props }: React.HTMLAttributes<HTMLOListElement>) {\r\n return (\r\n <ol\r\n className={cn(markdownComponents.ol, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ol>\r\n );\r\n}\r\n\r\nfunction MarkdownLi({ className, children, ...props }: React.HTMLAttributes<HTMLLIElement>) {\r\n return (\r\n <li\r\n className={cn(markdownComponents.li, className)}\r\n {...props}\r\n >\r\n {children}\r\n </li>\r\n );\r\n}\r\n\r\n/**\r\n * Blockquote renderer for Markdown\r\n */\r\nfunction MarkdownBlockquote({ className, children, ...props }: React.HTMLAttributes<HTMLQuoteElement>) {\r\n return (\r\n <blockquote\r\n className={cn(markdownComponents.blockquote, className)}\r\n {...props}\r\n >\r\n {children}\r\n </blockquote>\r\n );\r\n}\r\n\r\n/**\r\n * Anchor renderer for Markdown\r\n */\r\nfunction MarkdownA({ className, children, href, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) {\r\n return (\r\n <a\r\n className={cn(markdownComponents.a, className)}\r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n );\r\n}\r\n\r\n/**\r\n * Strong/Bold renderer for Markdown\r\n */\r\nfunction MarkdownStrong({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <strong\r\n className={cn(markdownComponents.strong, className)}\r\n {...props}\r\n >\r\n {children}\r\n </strong>\r\n );\r\n}\r\n\r\n// ========== Markdown Renderer ==========\r\n\r\n/**\r\n * Markdown content renderer with syntax highlighting\r\n */\r\nfunction MarkdownRenderer({ content, className }: { content: string; className?: string }) {\r\n return (\r\n <div className={cn('prose prose-sm dark:prose-invert max-w-none', className)}>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeHighlight]}\r\n components={{\r\n h1: MarkdownH1,\r\n h2: MarkdownH2,\r\n h3: MarkdownH3,\r\n p: MarkdownParagraph,\r\n ul: MarkdownUl,\r\n ol: MarkdownOl,\r\n li: MarkdownLi,\r\n code: MarkdownCode,\r\n pre: MarkdownPre,\r\n blockquote: MarkdownBlockquote,\r\n a: MarkdownA,\r\n strong: MarkdownStrong,\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Text Renderer ==========\r\n\r\n/**\r\n * Plain text renderer with escape sequence handling\r\n */\r\nfunction TextRenderer({ content, maxLines }: { content: string; maxLines?: number }) {\r\n const lines = useMemo(() => {\r\n return content.split('\\n');\r\n }, [content]);\r\n\r\n const displayLines = useMemo(() => {\r\n if (maxLines && lines.length > maxLines) {\r\n return lines.slice(0, maxLines);\r\n }\r\n return lines;\r\n }, [lines, maxLines]);\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n\r\n return (\r\n <div className=\"text-sm text-foreground whitespace-pre-wrap break-words font-mono\">\r\n {displayLines.map((line, index) => (\r\n <div key={index}>{line || '\\u00A0'}</div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic text-xs mt-2\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Content Detection ==========\r\n\r\n/**\r\n * Auto-detect content format\r\n */\r\nfunction detectContentFormat(content: string): 'markdown' | 'json' | 'text' {\r\n const trimmed = content.trim();\r\n\r\n // Check for JSON first\r\n const jsonDetection = detectJsonContent(trimmed);\r\n if (jsonDetection.isJson) {\r\n return 'json';\r\n }\r\n\r\n // Check for Markdown patterns\r\n const markdownPatterns = [\r\n /^#{1,6}\\s+/m, // Headings\r\n /^\\*{3,}$/m, // Horizontal rule\r\n /^\\s*[-*+]\\s+/m, // Unordered lists\r\n /^\\s*\\d+\\.\\s+/m, // Ordered lists\r\n /\\[.*?\\]\\(.*?\\)/, // Links\r\n /`{3,}[\\s\\S]*?`{3,}/, // Code blocks\r\n /\\*\\*.*?\\*\\*/, // Bold\r\n /_.*?_/, // Italic\r\n /^\\s*>\\s+/m, // Blockquotes\r\n ];\r\n\r\n for (const pattern of markdownPatterns) {\r\n if (pattern.test(trimmed)) {\r\n return 'markdown';\r\n }\r\n }\r\n\r\n // Default to text\r\n return 'text';\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * MessageRenderer Component\r\n *\r\n * Renders message content with automatic format detection:\r\n * - JSON: Structured display with JsonFormatter\r\n * - Markdown: Rich text with syntax highlighting\r\n * - Text: Plain text with escape sequence handling\r\n *\r\n * Supports escape sequence handling (e.g., \\n → newline)\r\n */\r\nexport function MessageRenderer({\r\n content,\r\n className,\r\n format,\r\n maxLines,\r\n}: MessageRendererProps) {\r\n // Process escape sequences\r\n const processedContent = useMemo(() => {\r\n // Replace common escape sequences\r\n return content\r\n .replace(/\\\\n/g, '\\n')\r\n .replace(/\\\\t/g, ' ')\r\n .replace(/\\\\\"/g, '\"')\r\n .replace(/\\\\'/g, \"'\")\r\n .replace(/\\\\\\\\/g, '\\\\');\r\n }, [content]);\r\n\r\n // Auto-detect format if not specified\r\n const detectedFormat = useMemo(() => {\r\n if (format) {\r\n return format;\r\n }\r\n return detectContentFormat(processedContent);\r\n }, [processedContent, format]);\r\n\r\n // Render based on format\r\n switch (detectedFormat) {\r\n case 'json':\r\n return (\r\n <div className={className}>\r\n <JsonFormatter\r\n content={processedContent}\r\n displayMode=\"text\"\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n\r\n case 'markdown':\r\n return (\r\n <MarkdownRenderer\r\n content={processedContent}\r\n className={className}\r\n />\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <TextRenderer\r\n content={processedContent}\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default MessageRenderer;\r\n"],"names":["detectJson","content","trimmed","parsed","format","error","extractJson","depth","inString","escape","end","i","char","codeBlockMatch","detectJsonContent","extracted","formatJson","data","indent","getJsonSummary","length","keys","getJsonValueTypeColor","value","CopyButton","text","copied","setCopied","useState","handleCopy","useCallback","err","jsx","Button","jsxs","Fragment","Check","Copy","JsonValue","colorClass","item","index","entries","key","val","JsonCompact","JsonCard","showTypeLabels","expandedKeys","setExpandedKeys","toggleKey","prev","next","Braces","isObject","isExpanded","isArray","summary","cn","ChevronDown","ChevronRight","JsonText","maxLines","formatted","useMemo","lines","showTruncated","displayLines","line","JsonFormatter","displayMode","className","detection","markdownComponents","MarkdownCode","children","props","MarkdownPre","MarkdownParagraph","MarkdownH1","MarkdownH2","MarkdownH3","MarkdownUl","MarkdownOl","MarkdownLi","MarkdownBlockquote","MarkdownA","href","MarkdownStrong","MarkdownRenderer","ReactMarkdown","remarkGfm","rehypeHighlight","TextRenderer","detectContentFormat","markdownPatterns","pattern","MessageRenderer","processedContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-B9A3Hnrk.js","sources":["../../src/components/shared/LogBlock/jsonUtils.ts","../../src/components/shared/LogBlock/JsonFormatter.tsx","../../src/components/shared/CliStreamMonitor/MessageRenderer/index.tsx"],"sourcesContent":["// ========================================\r\n// LogBlock JSON Utilities\r\n// ========================================\r\n// JSON content detection and formatting utilities\r\n\r\n/**\r\n * JSON content type detection result\r\n */\r\nexport interface JsonDetectionResult {\r\n isJson: boolean;\r\n parsed?: unknown;\r\n error?: string;\r\n format: 'object' | 'array' | 'primitive' | 'invalid';\r\n}\r\n\r\n/**\r\n * Display mode for JSON content\r\n */\r\nexport type JsonDisplayMode = 'text' | 'card' | 'inline';\r\n\r\n/**\r\n * Detect if content is valid JSON\r\n *\r\n * @param content - Content string to check\r\n * @returns Detection result with parsed data if valid\r\n */\r\nexport function detectJson(content: string): JsonDetectionResult {\r\n const trimmed = content.trim();\r\n\r\n // Quick check for JSON patterns\r\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\r\n return { isJson: false, format: 'invalid' };\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n\r\n // Determine format type\r\n let format: JsonDetectionResult['format'] = 'primitive';\r\n if (Array.isArray(parsed)) {\r\n format = 'array';\r\n } else if (parsed !== null && typeof parsed === 'object') {\r\n format = 'object';\r\n }\r\n\r\n return { isJson: true, parsed, format };\r\n } catch (error) {\r\n return {\r\n isJson: false,\r\n format: 'invalid',\r\n error: error instanceof Error ? error.message : 'Unknown parse error'\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Extract JSON from mixed content\r\n * Handles cases where JSON is embedded in text output\r\n *\r\n * @param content - Content that may contain JSON\r\n * @returns Extracted JSON string or null if not found\r\n */\r\nexport function extractJson(content: string): string | null {\r\n const trimmed = content.trim();\r\n\r\n // Direct JSON\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n // Find the matching bracket\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n let end = -1;\r\n\r\n for (let i = 0; i < trimmed.length; i++) {\r\n const char = trimmed[i];\r\n\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n inString = !inString;\r\n continue;\r\n }\r\n\r\n if (!inString) {\r\n if (char === '{' || char === '[') {\r\n depth++;\r\n } else if (char === '}' || char === ']') {\r\n depth--;\r\n if (depth === 0) {\r\n end = i + 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (end > 0) {\r\n return trimmed.substring(0, end);\r\n }\r\n }\r\n\r\n // Try to find JSON in code blocks\r\n const codeBlockMatch = content.match(/```(?:json)?\\s*\\n([\\s\\S]*?)\\n```/);\r\n if (codeBlockMatch) {\r\n return codeBlockMatch[1].trim();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Detect if content should be displayed as JSON\r\n * Combines extraction and validation\r\n *\r\n * @param content - Content to check\r\n * @returns Detection result\r\n */\r\nexport function detectJsonContent(content: string): JsonDetectionResult & { extracted: string | null } {\r\n const extracted = extractJson(content);\r\n\r\n if (!extracted) {\r\n return { isJson: false, format: 'invalid', extracted: null };\r\n }\r\n\r\n const result = detectJson(extracted);\r\n return { ...result, extracted };\r\n}\r\n\r\n/**\r\n * Format JSON for display\r\n *\r\n * @param data - Parsed JSON data\r\n * @param indent - Indentation spaces (default: 2)\r\n * @returns Formatted JSON string\r\n */\r\nexport function formatJson(data: unknown, indent: number = 2): string {\r\n return JSON.stringify(data, null, indent);\r\n}\r\n\r\n/**\r\n * Get a summary string for JSON data\r\n *\r\n * @param data - Parsed JSON data\r\n * @returns Summary description\r\n */\r\nexport function getJsonSummary(data: unknown): string {\r\n if (data === null) return 'null';\r\n if (typeof data === 'boolean') return data ? 'true' : 'false';\r\n if (typeof data === 'number') return String(data);\r\n if (typeof data === 'string') return `\"${data.length > 30 ? data.substring(0, 30) + '...' : data}\"`;\r\n\r\n if (Array.isArray(data)) {\r\n const length = data.length;\r\n return `Array[${length}]${length > 0 ? ` (${getJsonSummary(data[0])}, ...)` : ''}`;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const keys = Object.keys(data);\r\n return `Object{${keys.length}}${keys.length > 0 ? ` (${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', ...' : ''})` : ''}`;\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\n/**\r\n * Get color class for JSON value type\r\n *\r\n * @param value - JSON value\r\n * @returns Tailwind color class\r\n */\r\nexport function getJsonValueTypeColor(value: unknown): string {\r\n if (value === null) return 'text-muted-foreground';\r\n if (typeof value === 'boolean') return 'text-purple-400';\r\n if (typeof value === 'number') return 'text-orange-400';\r\n if (typeof value === 'string') return 'text-green-400';\r\n if (Array.isArray(value)) return 'text-blue-400';\r\n if (typeof value === 'object') return 'text-yellow-400';\r\n return 'text-foreground';\r\n}\r\n","// ========================================\r\n// JsonFormatter Component\r\n// ========================================\r\n// Displays JSON content in formatted text or card view\r\n\r\nimport { useState, useCallback, useMemo } from 'react';\r\nimport { ChevronDown, ChevronRight, Copy, Check, Braces } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n detectJsonContent,\r\n formatJson,\r\n getJsonSummary,\r\n getJsonValueTypeColor,\r\n type JsonDisplayMode,\r\n} from './jsonUtils';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface JsonFormatterProps {\r\n /** Content to format */\r\n content: string;\r\n /** Display mode */\r\n displayMode?: JsonDisplayMode;\r\n /** CSS className */\r\n className?: string;\r\n /** Maximum lines for text mode (default: 20) */\r\n maxLines?: number;\r\n /** Whether to show type labels in card mode (default: true) */\r\n showTypeLabels?: boolean;\r\n}\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Copy button with feedback\r\n */\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = useCallback(async () => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }, [text]);\r\n\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n className=\"h-6 px-2 text-xs opacity-0 group-hover:opacity-100 transition-opacity\"\r\n >\r\n {copied ? (\r\n <>\r\n <Check className=\"h-3 w-3 mr-1\" />\r\n Copied\r\n </>\r\n ) : (\r\n <>\r\n <Copy className=\"h-3 w-3 mr-1\" />\r\n Copy\r\n </>\r\n )}\r\n </Button>\r\n );\r\n}\r\n\r\n/**\r\n * JSON value renderer with syntax highlighting\r\n */\r\nfunction JsonValue({ value, depth = 0 }: { value: unknown; depth?: number }) {\r\n const indent = ' '.repeat(depth);\r\n const colorClass = getJsonValueTypeColor(value);\r\n\r\n if (value === null) {\r\n return <span className={colorClass}>null</span>;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return <span className={colorClass}>{String(value)}</span>;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return <span className={colorClass}>\"{value}\"</span>;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length === 0) {\r\n return <span className=\"text-blue-400\">[]</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-blue-400\">\r\n <span>[</span>\r\n <div className=\"pl-4\">\r\n {value.map((item, index) => (\r\n <div key={index} className=\"hover:bg-muted/50 rounded px-1\">\r\n <JsonValue value={item} depth={depth + 1} />\r\n {index < value.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}]</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value as Record<string, unknown>);\r\n if (entries.length === 0) {\r\n return <span className=\"text-yellow-400\">{`{}`}</span>;\r\n }\r\n\r\n return (\r\n <div className=\"text-yellow-400\">\r\n <span>{`{`}</span>\r\n <div className=\"pl-4\">\r\n {entries.map(([key, val], index) => (\r\n <div key={key} className=\"hover:bg-muted/50 rounded px-1\">\r\n <span className=\"text-cyan-400\">\"{key}\"</span>\r\n <span className=\"text-foreground\">: </span>\r\n <JsonValue value={val} depth={depth + 1} />\r\n {index < entries.length - 1 && <span className=\"text-foreground\">,</span>}\r\n </div>\r\n ))}\r\n </div>\r\n <span>{indent}{`}`}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return <span>{String(value)}</span>;\r\n}\r\n\r\n/**\r\n * Compact JSON view for inline display\r\n */\r\nfunction JsonCompact({ data }: { data: unknown }) {\r\n return (\r\n <code className=\"text-xs font-mono\">\r\n <JsonValue value={data} />\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Card view for structured JSON display\r\n */\r\nfunction JsonCard({ data, showTypeLabels = true }: { data: unknown; showTypeLabels?: boolean }) {\r\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\r\n\r\n const toggleKey = useCallback((key: string) => {\r\n setExpandedKeys((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\r\n // Primitive or array - use inline view\r\n return (\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCompact data={data} />\r\n </div>\r\n );\r\n }\r\n\r\n const entries = Object.entries(data as Record<string, unknown>);\r\n\r\n return (\r\n <div className=\"border border-border rounded-lg overflow-hidden bg-card\">\r\n {/* Header */}\r\n <div className=\"flex items-center gap-2 px-3 py-2 bg-muted/50 border-b border-border\">\r\n <Braces className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"text-sm font-medium\">JSON Data</span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n ({entries.length} {entries.length === 1 ? 'property' : 'properties'})\r\n </span>\r\n </div>\r\n\r\n {/* Properties */}\r\n <div className=\"divide-y divide-border\">\r\n {entries.map(([key, value]) => {\r\n const isObject = value !== null && typeof value === 'object';\r\n const isExpanded = expandedKeys.has(key);\r\n const isArray = Array.isArray(value);\r\n const summary = getJsonSummary(value);\r\n\r\n return (\r\n <div key={key} className=\"group\">\r\n <div\r\n className={cn(\r\n 'flex items-start gap-2 px-3 py-2 hover:bg-muted/30 transition-colors',\r\n isObject && 'cursor-pointer'\r\n )}\r\n onClick={() => isObject && toggleKey(key)}\r\n >\r\n {/* Expand/collapse icon */}\r\n {isObject && (\r\n <div className=\"shrink-0 mt-0.5\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Key */}\r\n <span className=\"font-mono text-sm text-cyan-400 shrink-0\">\"{key}\"</span>\r\n <span className=\"text-muted-foreground shrink-0\">:</span>\r\n\r\n {/* Value summary or full value */}\r\n <div className={cn('flex-1 min-w-0', getJsonValueTypeColor(value))}>\r\n {showTypeLabels && (\r\n <span className=\"text-xs text-muted-foreground mr-1\">\r\n {isArray ? 'array' : isObject ? 'object' : typeof value}\r\n </span>\r\n )}\r\n {!isObject ? (\r\n <span className=\"text-sm font-mono break-all\">{summary}</span>\r\n ) : (\r\n <span className=\"text-sm\">{summary}</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded nested object */}\r\n {isObject && isExpanded && (\r\n <div className=\"pl-8 pr-3 pb-2\">\r\n <div className=\"p-3 bg-muted/30 rounded border border-border\">\r\n <JsonCard data={value} showTypeLabels={showTypeLabels} />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Text view for formatted JSON\r\n */\r\nfunction JsonText({ data, maxLines = 20 }: { data: unknown; maxLines?: number }) {\r\n const formatted = useMemo(() => formatJson(data), [data]);\r\n const lines = formatted.split('\\n');\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n const displayLines = showTruncated ? lines.slice(0, maxLines) : lines;\r\n\r\n return (\r\n <div className=\"relative group\">\r\n <pre className=\"text-xs font-mono bg-muted/30 p-3 rounded border border-border overflow-x-auto\">\r\n <code className=\"text-foreground\">\r\n {displayLines.map((line, i) => (\r\n <div key={i} className=\"hover:bg-muted/50 px-1 -mx-1\">\r\n {line}\r\n </div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </code>\r\n </pre>\r\n\r\n {/* Copy button */}\r\n <div className=\"absolute top-2 right-2\">\r\n <CopyButton text={formatted} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * JsonFormatter Component\r\n *\r\n * Displays JSON content in various formats:\r\n * - `text`: Formatted JSON text with syntax highlighting\r\n * - `card`: Structured card view with collapsible properties\r\n * - `inline`: Compact inline display\r\n *\r\n * Auto-detects JSON from mixed content and validates it.\r\n */\r\nexport function JsonFormatter({\r\n content,\r\n displayMode = 'text',\r\n className,\r\n maxLines = 20,\r\n showTypeLabels = true,\r\n}: JsonFormatterProps) {\r\n // Detect JSON content\r\n const detection = useMemo(() => detectJsonContent(content), [content]);\r\n\r\n // Not JSON or invalid - show as plain text\r\n if (!detection.isJson) {\r\n return (\r\n <div className={cn('text-xs font-mono text-foreground', className)}>\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n // Valid JSON - render based on display mode\r\n switch (displayMode) {\r\n case 'card':\r\n return (\r\n <div className={className}>\r\n <JsonCard data={detection.parsed} showTypeLabels={showTypeLabels} />\r\n </div>\r\n );\r\n\r\n case 'inline':\r\n return (\r\n <div className={cn('inline-flex items-center gap-1 px-2 py-1 bg-muted/50 rounded border border-border', className)}>\r\n <Braces className=\"h-3 w-3 text-muted-foreground shrink-0\" />\r\n <span className=\"text-xs font-mono\">\r\n <JsonCompact data={detection.parsed} />\r\n </span>\r\n </div>\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <JsonText data={detection.parsed} maxLines={maxLines} />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default JsonFormatter;\r\n","// ========================================\r\n// MessageRenderer Component\r\n// ========================================\r\n// Renders message content with Markdown support, JSON formatting,\r\n// and escape sequence handling\r\n\r\nimport { useMemo } from 'react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeHighlight from 'rehype-highlight';\r\nimport { cn } from '@/lib/utils';\r\nimport { JsonFormatter } from '../../LogBlock/JsonFormatter';\r\nimport { detectJsonContent } from '../../LogBlock/jsonUtils';\r\n\r\n// Import highlight.js styles for code syntax highlighting\r\n// Using a base style that works with both light and dark themes\r\nimport 'highlight.js/styles/base16/atelier-forest.css';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface MessageRendererProps {\r\n /** Content to render */\r\n content: string;\r\n /** Additional CSS className */\r\n className?: string;\r\n /** Format hint (auto-detect if not specified) */\r\n format?: 'markdown' | 'text' | 'json';\r\n /** Maximum lines to display (for text mode) */\r\n maxLines?: number;\r\n}\r\n\r\n// ========== Markdown Component Styles ==========\r\n\r\nconst markdownComponents: Record<string, string> = {\r\n h1: 'text-xl font-bold mt-4 mb-2 text-foreground',\r\n h2: 'text-lg font-semibold mt-3 mb-2 text-foreground',\r\n h3: 'text-base font-semibold mt-2 mb-1 text-foreground',\r\n p: 'text-sm leading-relaxed mb-2 text-foreground',\r\n ul: 'list-disc list-inside mb-2 text-sm space-y-1',\r\n ol: 'list-decimal list-inside mb-2 text-sm space-y-1',\r\n li: 'text-sm text-foreground',\r\n code: 'font-mono text-xs bg-muted px-1.5 py-0.5 rounded text-amber-600 dark:text-amber-400',\r\n pre: 'bg-muted/80 dark:bg-muted/30 p-3 rounded-lg overflow-x-auto my-2 border border-border/50',\r\n blockquote: 'border-l-4 border-muted-foreground pl-4 italic text-muted-foreground my-2',\r\n strong: 'font-semibold text-foreground',\r\n a: 'text-blue-600 dark:text-blue-400 hover:underline',\r\n};\r\n\r\n// ========== Helper Components ==========\r\n\r\n/**\r\n * Inline code renderer for Markdown\r\n */\r\nfunction MarkdownCode({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <code\r\n className={cn(markdownComponents.code, className)}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n}\r\n\r\n/**\r\n * Code block renderer for Markdown with syntax highlighting\r\n */\r\nfunction MarkdownPre({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <pre\r\n className={cn(markdownComponents.pre, className)}\r\n {...props}\r\n >\r\n {children}\r\n </pre>\r\n );\r\n}\r\n\r\n/**\r\n * Paragraph renderer for Markdown\r\n */\r\nfunction MarkdownParagraph({ className, children, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p\r\n className={cn(markdownComponents.p, className)}\r\n {...props}\r\n >\r\n {children}\r\n </p>\r\n );\r\n}\r\n\r\n/**\r\n * Heading renderers for Markdown\r\n */\r\nfunction MarkdownH1({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h1\r\n className={cn(markdownComponents.h1, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h1>\r\n );\r\n}\r\n\r\nfunction MarkdownH2({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h2\r\n className={cn(markdownComponents.h2, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h2>\r\n );\r\n}\r\n\r\nfunction MarkdownH3({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h3\r\n className={cn(markdownComponents.h3, className)}\r\n {...props}\r\n >\r\n {children}\r\n </h3>\r\n );\r\n}\r\n\r\n/**\r\n * List renderers for Markdown\r\n */\r\nfunction MarkdownUl({ className, children, ...props }: React.HTMLAttributes<HTMLUListElement>) {\r\n return (\r\n <ul\r\n className={cn(markdownComponents.ul, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction MarkdownOl({ className, children, ...props }: React.HTMLAttributes<HTMLOListElement>) {\r\n return (\r\n <ol\r\n className={cn(markdownComponents.ol, className)}\r\n {...props}\r\n >\r\n {children}\r\n </ol>\r\n );\r\n}\r\n\r\nfunction MarkdownLi({ className, children, ...props }: React.HTMLAttributes<HTMLLIElement>) {\r\n return (\r\n <li\r\n className={cn(markdownComponents.li, className)}\r\n {...props}\r\n >\r\n {children}\r\n </li>\r\n );\r\n}\r\n\r\n/**\r\n * Blockquote renderer for Markdown\r\n */\r\nfunction MarkdownBlockquote({ className, children, ...props }: React.HTMLAttributes<HTMLQuoteElement>) {\r\n return (\r\n <blockquote\r\n className={cn(markdownComponents.blockquote, className)}\r\n {...props}\r\n >\r\n {children}\r\n </blockquote>\r\n );\r\n}\r\n\r\n/**\r\n * Anchor renderer for Markdown\r\n */\r\nfunction MarkdownA({ className, children, href, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) {\r\n return (\r\n <a\r\n className={cn(markdownComponents.a, className)}\r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n );\r\n}\r\n\r\n/**\r\n * Strong/Bold renderer for Markdown\r\n */\r\nfunction MarkdownStrong({ className, children, ...props }: React.HTMLAttributes<HTMLElement>) {\r\n return (\r\n <strong\r\n className={cn(markdownComponents.strong, className)}\r\n {...props}\r\n >\r\n {children}\r\n </strong>\r\n );\r\n}\r\n\r\n// ========== Markdown Renderer ==========\r\n\r\n/**\r\n * Markdown content renderer with syntax highlighting\r\n */\r\nfunction MarkdownRenderer({ content, className }: { content: string; className?: string }) {\r\n return (\r\n <div className={cn('prose prose-sm dark:prose-invert max-w-none', className)}>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeHighlight]}\r\n components={{\r\n h1: MarkdownH1,\r\n h2: MarkdownH2,\r\n h3: MarkdownH3,\r\n p: MarkdownParagraph,\r\n ul: MarkdownUl,\r\n ol: MarkdownOl,\r\n li: MarkdownLi,\r\n code: MarkdownCode,\r\n pre: MarkdownPre,\r\n blockquote: MarkdownBlockquote,\r\n a: MarkdownA,\r\n strong: MarkdownStrong,\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Text Renderer ==========\r\n\r\n/**\r\n * Plain text renderer with escape sequence handling\r\n */\r\nfunction TextRenderer({ content, maxLines }: { content: string; maxLines?: number }) {\r\n const lines = useMemo(() => {\r\n return content.split('\\n');\r\n }, [content]);\r\n\r\n const displayLines = useMemo(() => {\r\n if (maxLines && lines.length > maxLines) {\r\n return lines.slice(0, maxLines);\r\n }\r\n return lines;\r\n }, [lines, maxLines]);\r\n\r\n const showTruncated = maxLines && lines.length > maxLines;\r\n\r\n return (\r\n <div className=\"text-sm text-foreground whitespace-pre-wrap break-words font-mono\">\r\n {displayLines.map((line, index) => (\r\n <div key={index}>{line || '\\u00A0'}</div>\r\n ))}\r\n {showTruncated && (\r\n <div className=\"text-muted-foreground italic text-xs mt-2\">\r\n // ... {lines.length - maxLines} more lines\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Content Detection ==========\r\n\r\n/**\r\n * Auto-detect content format\r\n */\r\nfunction detectContentFormat(content: string): 'markdown' | 'json' | 'text' {\r\n const trimmed = content.trim();\r\n\r\n // Check for JSON first\r\n const jsonDetection = detectJsonContent(trimmed);\r\n if (jsonDetection.isJson) {\r\n return 'json';\r\n }\r\n\r\n // Check for Markdown patterns\r\n const markdownPatterns = [\r\n /^#{1,6}\\s+/m, // Headings\r\n /^\\*{3,}$/m, // Horizontal rule\r\n /^\\s*[-*+]\\s+/m, // Unordered lists\r\n /^\\s*\\d+\\.\\s+/m, // Ordered lists\r\n /\\[.*?\\]\\(.*?\\)/, // Links\r\n /`{3,}[\\s\\S]*?`{3,}/, // Code blocks\r\n /\\*\\*.*?\\*\\*/, // Bold\r\n /_.*?_/, // Italic\r\n /^\\s*>\\s+/m, // Blockquotes\r\n ];\r\n\r\n for (const pattern of markdownPatterns) {\r\n if (pattern.test(trimmed)) {\r\n return 'markdown';\r\n }\r\n }\r\n\r\n // Default to text\r\n return 'text';\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * MessageRenderer Component\r\n *\r\n * Renders message content with automatic format detection:\r\n * - JSON: Structured display with JsonFormatter\r\n * - Markdown: Rich text with syntax highlighting\r\n * - Text: Plain text with escape sequence handling\r\n *\r\n * Supports escape sequence handling (e.g., \\n → newline)\r\n */\r\nexport function MessageRenderer({\r\n content,\r\n className,\r\n format,\r\n maxLines,\r\n}: MessageRendererProps) {\r\n // Process escape sequences\r\n const processedContent = useMemo(() => {\r\n // Replace common escape sequences\r\n return content\r\n .replace(/\\\\n/g, '\\n')\r\n .replace(/\\\\t/g, ' ')\r\n .replace(/\\\\\"/g, '\"')\r\n .replace(/\\\\'/g, \"'\")\r\n .replace(/\\\\\\\\/g, '\\\\');\r\n }, [content]);\r\n\r\n // Auto-detect format if not specified\r\n const detectedFormat = useMemo(() => {\r\n if (format) {\r\n return format;\r\n }\r\n return detectContentFormat(processedContent);\r\n }, [processedContent, format]);\r\n\r\n // Render based on format\r\n switch (detectedFormat) {\r\n case 'json':\r\n return (\r\n <div className={className}>\r\n <JsonFormatter\r\n content={processedContent}\r\n displayMode=\"text\"\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n\r\n case 'markdown':\r\n return (\r\n <MarkdownRenderer\r\n content={processedContent}\r\n className={className}\r\n />\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <div className={className}>\r\n <TextRenderer\r\n content={processedContent}\r\n maxLines={maxLines}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default MessageRenderer;\r\n"],"names":["detectJson","content","trimmed","parsed","format","error","extractJson","depth","inString","escape","end","i","char","codeBlockMatch","detectJsonContent","extracted","formatJson","data","indent","getJsonSummary","length","keys","getJsonValueTypeColor","value","CopyButton","text","copied","setCopied","useState","handleCopy","useCallback","err","jsx","Button","jsxs","Fragment","Check","Copy","JsonValue","colorClass","item","index","entries","key","val","JsonCompact","JsonCard","showTypeLabels","expandedKeys","setExpandedKeys","toggleKey","prev","next","Braces","isObject","isExpanded","isArray","summary","cn","ChevronDown","ChevronRight","JsonText","maxLines","formatted","useMemo","lines","showTruncated","displayLines","line","JsonFormatter","displayMode","className","detection","markdownComponents","MarkdownCode","children","props","MarkdownPre","MarkdownParagraph","MarkdownH1","MarkdownH2","MarkdownH3","MarkdownUl","MarkdownOl","MarkdownLi","MarkdownBlockquote","MarkdownA","href","MarkdownStrong","MarkdownRenderer","ReactMarkdown","remarkGfm","rehypeHighlight","TextRenderer","detectContentFormat","markdownPatterns","pattern","MessageRenderer","processedContent"],"mappings":"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"}
|