diff --git a/apps/web/package.json b/apps/web/package.json
index 656c6aa..0b30f6a 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -34,6 +34,7 @@
"zod": "^4.0.0"
},
"devDependencies": {
+ "@tailwindcss/typography": "^0.5.19",
"@tpmjs/eslint-config": "workspace:*",
"@tpmjs/tailwind-config": "workspace:*",
"@tpmjs/tsconfig": "workspace:*",
diff --git a/apps/web/src/components/ToolPlayground.tsx b/apps/web/src/components/ToolPlayground.tsx
index 0cacc3b..62b740b 100644
--- a/apps/web/src/components/ToolPlayground.tsx
+++ b/apps/web/src/components/ToolPlayground.tsx
@@ -8,6 +8,8 @@
import type { TokenBreakdown as TokenData } from '@/lib/ai-agent/tool-executor-agent';
import type { Tool } from '@tpmjs/db';
import { useState } from 'react';
+import ReactMarkdown from 'react-markdown';
+import remarkGfm from 'remark-gfm';
import { TokenBreakdown } from './TokenBreakdown';
interface ToolPlaygroundProps {
@@ -119,7 +121,8 @@ export function ToolPlayground({ tool }: ToolPlaygroundProps): React.ReactElemen
break;
case 'complete':
- setOutput(data.output);
+ // Don't replace output - keep the streamed text
+ // setOutput(data.output); // Removed: this was overwriting streamed content
setTokens(data.tokenBreakdown);
setLogs((prev) => [
...prev,
@@ -208,6 +211,7 @@ export function ToolPlayground({ tool }: ToolPlaygroundProps): React.ReactElemen
{tabs.map((tab) => (
) : output ? (
-
-
- {output}
-
+
+ {output}
) : isExecuting ? (
diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts
index a4aea36..9e9217f 100644
--- a/apps/web/tailwind.config.ts
+++ b/apps/web/tailwind.config.ts
@@ -8,4 +8,5 @@ export default {
'./src/components/**/*.{ts,tsx}',
'../../packages/ui/src/**/*.ts',
],
+ plugins: [...(baseConfig.plugins || []), require('@tailwindcss/typography')],
} satisfies Config;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 97787a3..ebed9af 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -105,6 +105,9 @@ importers:
specifier: ^4.0.0
version: 4.1.13
devDependencies:
+ '@tailwindcss/typography':
+ specifier: ^0.5.19
+ version: 0.5.19(tailwindcss@3.4.18(tsx@4.20.6))
'@tpmjs/eslint-config':
specifier: workspace:*
version: link:../../packages/config/eslint
@@ -1966,6 +1969,11 @@ packages:
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+ '@tailwindcss/typography@0.5.19':
+ resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+
'@testing-library/dom@10.4.0':
resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
engines: {node: '>=18'}
@@ -4200,6 +4208,10 @@ packages:
peerDependencies:
postcss: ^8.2.14
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+
postcss-selector-parser@6.1.2:
resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
@@ -6448,6 +6460,11 @@ snapshots:
dependencies:
tslib: 2.8.1
+ '@tailwindcss/typography@0.5.19(tailwindcss@3.4.18(tsx@4.20.6))':
+ dependencies:
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.18(tsx@4.20.6)
+
'@testing-library/dom@10.4.0':
dependencies:
'@babel/code-frame': 7.27.1
@@ -9349,6 +9366,11 @@ snapshots:
postcss: 8.5.6
postcss-selector-parser: 6.1.2
+ postcss-selector-parser@6.0.10:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0