npm run dev:docs / build:docs serve the design specs + live component demos (@rspress/plugin-preview) with the app's vite aliases and style.css mirrored into the rspack config; stubs/url-stub.ts shims Node's url module for the browser bundle. doc_build/ output gitignored.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The page styled itself with class names that tailwind.config.js never
defined (text-text-primary, text-text-secondary, text-text-tertiary,
border-border-subtle, bg-background-primary). These emit no CSS, so text
colours came from inheritance and only happened to look right on light
backgrounds. Map them onto the tokens that do exist -- foreground,
muted-foreground, border, card, background -- and add dark variants to the
hardcoded gray/status colours.
Opacity modifiers on `white` are unusable here: tailwind.config.js
overrides white to var(--white), and Tailwind v3 cannot apply an alpha
channel to a CSS variable, so `bg-white/5` is dropped entirely. Use the
gray-50 scale for translucent dark overlays instead.
The tool overwrites .coaligneignore with its own default template, so tracking it means the rewrite lands in everyone's tree — keep it per-developer alongside .coaligne/.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The .coaligne/ dir holds per-developer project bindings that the tool regenerates (it re-binds and rewrites them on its own), so it should never have been tracked — untrack the two committed state files and ignore the dir.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Update GalleryApp wiring and the Button/Color/ConfirmDialog/Feedback/Illustration/Modal/Responsive/Typography showcases.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The old .theme-green steps sat at hue ~157 (teal) while --brand-500 is 142, so the main color jumped out of its own ramp. Light steps keep the old saturation/brightness envelope with the hue rotated onto the 500 family (-2/step, mirroring the blue lights); dark steps mirror the blue ramp's dark-side HSV geometry. --brand-500/main unchanged; surface-active-alt re-synced to --brand-50. Values updated in BRAND-THEME-HANDOFF.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The bench 首页/订阅/应用中心 tabs anchor their bottom save buttons with
absolute bottom-1 on CardContent, whose height is tuned via a 100vh-180px
magic constant that assumes no CardContent bottom padding. These tabs kept
CardContent's default p-5 (20px bottom padding) while the working 知识空间
tab uses p-0, so their content ran 20px taller. With slack that overshoot
was absorbed, but when the license-expiry banner appears it consumes the
slack and the buttons spill below the viewport, half-clipped. Add pb-0 to
match the 知识空间 tab.
The code-interpreter tool description said nothing about which Python packages
are available, so the model guessed — reaching for pdfminer.six to read PDFs (a
common default) which is NOT installed in the backend env, producing spurious
"No module named 'pdfminer'" output (it fell back to fitz, but the noise leaked
into the run).
Declare the actually-installed libraries (verified in the backend env: pandas,
numpy, matplotlib, openpyxl / XlsxWriter, python-docx, Pillow, reportlab, PyMuPDF)
and steer PDF reads to `fitz`, away from pdfminer / pdfplumber / PyPDF2. Also tell
the model not to `pip install` (shared, offline env). LocalExecutor only — e2b is
a different sandbox with a different image, not asserted here. Adds a
description-contract regression test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The code-interpreter tool description said nothing about which Python packages
are available, so the model guessed — reaching for pdfminer.six to read PDFs (a
common default) which is NOT installed in the backend env, producing spurious
"No module named 'pdfminer'" output (it fell back to fitz, but the noise leaked
into the run).
Declare the actually-installed libraries (verified in the backend env: pandas,
numpy, matplotlib, openpyxl / XlsxWriter, python-docx, Pillow, reportlab, PyMuPDF)
and steer PDF reads to `fitz`, away from pdfminer / pdfplumber / PyPDF2. Also tell
the model not to `pip install` (shared, offline env). LocalExecutor only — e2b is
a different sandbox with a different image, not asserted here. Adds a
description-contract regression test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
On an L3/L4 abort (tool-loop breaker / recursion ceiling), the partial-result
salvage falls back to `_last_assistant_text`, produced by
`_extract_last_message_text`. That helper returned `messages[-1]` WITHOUT
checking the role, so when a run was cut off mid tool-loop the trailing message
— typically a raw `bisheng_code_interpreter` ToolMessage such as
`{"exitcode":0,"log":"\nError: No module named 'pdfminer'\n=== PDF文本内容(fitz…"}`
— was surfaced verbatim after the apology preamble as "已完成的分析内容".
Walk backward to the last AIMessage carrying text instead; skip Tool/Human/
System messages. When the model never produced any text, return None so the
caller degrades to a friendly failure rather than dumping tool JSON. Split out
`_is_assistant_message` / `_message_text` helpers and cover with unit tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
On an L3/L4 abort (tool-loop breaker / recursion ceiling), the partial-result
salvage falls back to `_last_assistant_text`, produced by
`_extract_last_message_text`. That helper returned `messages[-1]` WITHOUT
checking the role, so when a run was cut off mid tool-loop the trailing message
— typically a raw `bisheng_code_interpreter` ToolMessage such as
`{"exitcode":0,"log":"\nError: No module named 'pdfminer'\n=== PDF文本内容(fitz…"}`
— was surfaced verbatim after the apology preamble as "已完成的分析内容".
Walk backward to the last AIMessage carrying text instead; skip Tool/Human/
System messages. When the model never produced any text, return None so the
caller degrades to a friendly failure rather than dumping tool JSON. Split out
`_is_assistant_message` / `_message_text` helpers and cover with unit tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The task-mode report md preview (PreviewBody → shared react-markdown) had two
independent rendering failures:
1. Relative image refs `` never resolved — the renderer has no
relative→absolute rewrite, so the browser resolved them against the SPA route
and got the index.html fallback (200 text/html) → broken image. Fix: a custom
async <img> renderer (MarkdownImage) resolves relative refs against the session
file_list (matchArtifactByRelPath → file_url → resolveArtifactUrl presigned
URL). Enabled only when a resolver is injected, so chat bubbles are unchanged.
2. Empty raw-HTML placeholder boxes (`<div style=...></div>` comment/figure
scaffolding) leaked as literal text because rehype-raw is deliberately off
(XSS guard). Fix: stripEmptyHtmlPlaceholders removes only *empty* paired block
tags in the md preview (preview-only; stored .md is untouched so HTML/PDF
derivation is unaffected).
Also nudge generation: the task-mode system prompt now tells the model to use
markdown image syntax and avoid raw HTML in the canonical md deliverable.
fileList is threaded through WorkspacePanel / FilePreviewPanel (via ExecutionFlow).
15 unit tests cover matching (path-suffix / basename / URL-encoded CN names) and
empty-box stripping. HTML (iframe srcDoc) preview has the same image gap — not
covered here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The task-mode report md preview (PreviewBody → shared react-markdown) had two
independent rendering failures:
1. Relative image refs `` never resolved — the renderer has no
relative→absolute rewrite, so the browser resolved them against the SPA route
and got the index.html fallback (200 text/html) → broken image. Fix: a custom
async <img> renderer (MarkdownImage) resolves relative refs against the session
file_list (matchArtifactByRelPath → file_url → resolveArtifactUrl presigned
URL). Enabled only when a resolver is injected, so chat bubbles are unchanged.
2. Empty raw-HTML placeholder boxes (`<div style=...></div>` comment/figure
scaffolding) leaked as literal text because rehype-raw is deliberately off
(XSS guard). Fix: stripEmptyHtmlPlaceholders removes only *empty* paired block
tags in the md preview (preview-only; stored .md is untouched so HTML/PDF
derivation is unaffected).
Also nudge generation: the task-mode system prompt now tells the model to use
markdown image syntax and avoid raw HTML in the canonical md deliverable.
fileList is threaded through WorkspacePanel / FilePreviewPanel (via ExecutionFlow).
15 unit tests cover matching (path-suffix / basename / URL-encoded CN names) and
empty-box stripping. HTML (iframe srcDoc) preview has the same image gap — not
covered here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drop the now-redundant opacity-90 on EmptyStateIllustration (the grey/mid-tone was darkened at the source, so the dimming hack is no longer needed) and normalize sizing to size-[120px] mb-4 across channel/subscription/knowledge/apps empty states.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Task-mode results claimed a deliverable (e.g. a generated PDF) that never
appeared in the workspace panel. Root cause: the model wrote the file to an
ABSOLUTE path (/output/report.pdf, /scratch/*.png) which resolves to the
container filesystem root -- outside the per-task working dir the LocalExecutor
harvests. The file was never uploaded (file_list=[]) nor synced, so
get_final_result_file found no deliverable and the panel fell back to a
synthesized fallback report. The shared LocalExecutor cannot safely rescue
container-root files (cross-task leak), so the fix steers the model to relative
paths:
- Harden the code-interpreter tool description (local + e2b) to require the
RELATIVE output/ (scratch/) dir and forbid absolute /output|/scratch, noting
files outside the working dir are discarded.
- Add a deterministic, non-blocking corrective notice: when a run's code wrote
to an absolute /output|/scratch path, append a system notice to the tool
result so the model self-corrects on the next step
(BaseExecutor.absolute_path_advisory + wiring in LocalExecutor.run).
- Tests: test/linsight/test_code_interpreter_output_path.py (18 cases).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Task-mode results claimed a deliverable (e.g. a generated PDF) that never
appeared in the workspace panel. Root cause: the model wrote the file to an
ABSOLUTE path (/output/report.pdf, /scratch/*.png) which resolves to the
container filesystem root -- outside the per-task working dir the LocalExecutor
harvests. The file was never uploaded (file_list=[]) nor synced, so
get_final_result_file found no deliverable and the panel fell back to a
synthesized fallback report. The shared LocalExecutor cannot safely rescue
container-root files (cross-task leak), so the fix steers the model to relative
paths:
- Harden the code-interpreter tool description (local + e2b) to require the
RELATIVE output/ (scratch/) dir and forbid absolute /output|/scratch, noting
files outside the working dir are discarded.
- Add a deterministic, non-blocking corrective notice: when a run's code wrote
to an absolute /output|/scratch path, append a system notice to the tool
result so the model self-corrects on the next step
(BaseExecutor.absolute_path_advisory + wiring in LocalExecutor.run).
- Tests: test/linsight/test_code_interpreter_output_path.py (18 cases).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DEV-only gallery: register the new Color/Scrollbar/Illustration sections in GalleryApp, add a progress/ tracker (per-component migration status), and refresh the Button/ConfirmDialog/Modal/Overview/Responsive/Typography showcases.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
illus-grey --illus-300 #FFFFFF→#E5E5E5 (grey mode only; green/blue keep the mid tone) — pure white made e.g. the CrawlingIllustration magnifier halo disappear on white backgrounds. New gallery IllustrationSection.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Per 基础-滚动条规范.md: remove the global :not(.scrollbar-os) forced-slim ::-webkit-scrollbar rule plus the .excel-scroll / .scrollbar-transparent overrides so OS auto-hide/always-on is respected; drop the now-dead excel-scroll class from ExcelPreview. New gallery ScrollbarSection. The .scrollbar-os opt-out is now a no-op, cleaned up as files get touched.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>