Open Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click
183 matches across 6 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | app/page.tsx | 1093 | // ─── Classroom Card — clean, minimal style ────────────────────── |
| MEDIUM | tests/export/classroom-zip.test.ts | 9 | // ─── rewriteAudioRefsToIds ──────────────────────────────────── |
| MEDIUM | tests/export/classroom-zip.test.ts | 82 | // ─── actionsToManifest ──────────────────────────────────────── |
| MEDIUM | tests/export/classroom-zip.test.ts | 168 | // ─── Manifest round-trip ────────────────────────────────────── |
| MEDIUM | components/scene-renderers/quiz-view.tsx | 35 | // ─── Types ────────────────────────────────────────────────────────────────── |
| MEDIUM | components/scene-renderers/quiz-view.tsx | 99 | // ─── Sub-components ───────────────────────────────────────────────────────── |
| MEDIUM | components/scene-renderers/quiz-view.tsx | 647 | // ─── Main Component ───────────────────────────────────────────────────────── |
| MEDIUM | components/chat/inline-action-tag.tsx | 32 | // ── Style tokens ────────────────────────────────────────────── |
| MEDIUM | components/chat/inline-action-tag.tsx | 47 | // ── Action config ───────────────────────────────────────────── |
| MEDIUM | components/chat/inline-action-tag.tsx | 83 | // ── Component ───────────────────────────────────────────────── |
| MEDIUM | components/generation/outlines-editor.tsx | 385 | // ──────────────────────────────────────────────────────────────────────────────── |
| MEDIUM | components/generation/outlines-editor.tsx | 387 | // ──────────────────────────────────────────────────────────────────────────────── |
| MEDIUM | components/generation/outlines-editor.tsx | 648 | // ──────────────────────────────────────────────────────────────────────────────── |
| MEDIUM | components/generation/outlines-editor.tsx | 650 | // ──────────────────────────────────────────────────────────────────────────────── |
| MEDIUM | components/generation/outlines-editor.tsx | 1131 | // ──────────────────────────────────────────────────────────────────────────────── |
| MEDIUM | components/generation/outlines-editor.tsx | 1133 | // ──────────────────────────────────────────────────────────────────────────────── |
| MEDIUM | components/generation/generation-toolbar.tsx | 40 | // ─── Constants ─────────────────────────────────────────────── |
| MEDIUM | components/generation/generation-toolbar.tsx | 44 | // ─── Types ─────────────────────────────────────────────────── |
| MEDIUM | components/generation/generation-toolbar.tsx | 55 | // ─── Component ─────────────────────────────────────────────── |
| MEDIUM | components/generation/generation-toolbar.tsx | 126 | // ─── Pill button helper ───────────────────────────── |
| MEDIUM | components/generation/generation-toolbar.tsx | 642 | // ─── ModelSettingsPopover (provider + model picker) ───── |
| MEDIUM | packages/pptxgenjs/src/gen-media.ts | 56 | // ──────────── NODE LOCAL FILE ──────────── |
| MEDIUM | packages/pptxgenjs/src/gen-media.ts | 74 | // ──────────── NODE HTTP(S) ──────────── |
| MEDIUM | packages/pptxgenjs/src/gen-media.ts | 99 | // ──────────── BROWSER ──────────── |
| MEDIUM | lib/pdf/mineru-cloud.ts | 65 | // ── API envelope ────────────────────────────────────────────────────────────── |
| MEDIUM | lib/pdf/mineru-cloud.ts | 94 | // ── Filename sanitization ───────────────────────────────────────────────────── |
| MEDIUM | lib/pdf/mineru-cloud.ts | 105 | // ── ZIP parsing ─────────────────────────────────────────────────────────────── |
| MEDIUM | lib/pdf/mineru-cloud.ts | 208 | // ── Main entry point ────────────────────────────────────────────────────────── |
| MEDIUM | lib/export/classroom-zip-utils.ts | 7 | // ─── Export: Collect Media ───────────────────────────────────── |
| MEDIUM | lib/export/classroom-zip-utils.ts | 51 | // ─── Export: Action Serialization ────────────────────────────── |
| MEDIUM | lib/export/classroom-zip-utils.ts | 82 | // ─── Import: Reference Rewriting ─────────────────────────────── |
| MEDIUM | lib/buffer/stream-buffer.ts | 18 | // ─── Buffer Item Types ─────────────────────────────────────────────── |
| MEDIUM | lib/buffer/stream-buffer.ts | 91 | // ─── Callbacks ─────────────────────────────────────────────────────── |
| MEDIUM | lib/buffer/stream-buffer.ts | 141 | // ─── Options ───────────────────────────────────────────────────────── |
| MEDIUM | lib/buffer/stream-buffer.ts | 161 | // ─── StreamBuffer Class ────────────────────────────────────────────── |
| MEDIUM | lib/buffer/stream-buffer.ts | 202 | // ─── Push Methods ──────────────────────────────────────────────── |
| MEDIUM | lib/buffer/stream-buffer.ts | 282 | // ─── Control ───────────────────────────────────────────────────── |
| MEDIUM | lib/buffer/stream-buffer.ts | 418 | // ─── Internals ─────────────────────────────────────────────────── |
| MEDIUM | e2e/tests/full-happy-path.spec.ts | 22 | // ── Phase 1: Home page ────────────────────────────────────────────── |
| MEDIUM | e2e/tests/full-happy-path.spec.ts | 39 | // ── Phase 2: Generation preview ───────────────────────────────────── |
| MEDIUM | e2e/tests/full-happy-path.spec.ts | 49 | // ── Phase 3: Classroom ────────────────────────────────────────────── |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | app/generation-preview/components/visualizers.tsx | 246 | function StreamingOutlineVisualizer({ |
| LOW | app/generation-preview/components/visualizers.tsx | 386 | function AgentGenerationVisualizer() { |
| LOW | tests/ai/openai-provider.test.ts | 16 | async function captureInjectedRequestBody( |
| LOW | components/settings/utils.ts | 41 | export function createCustomProviderSettings( |
| LOW | components/scene-renderers/classroom-complete.tsx | 499 | export function ClassroomCompletePageConnected() { |
| LOW | components/whiteboard/whiteboard-canvas.tsx | 107 | >(function InteractiveWhiteboardCanvas( |
| LOW | components/roundtable/presentation-speech-overlay.tsx | 41 | export function buildPresentationBubbleModel({ |
| LOW | components/roundtable/presentation-speech-overlay.tsx | 388 | export function PresentationSpeechOverlay({ |
| LOW | …r/components/element/VideoElement/BaseVideoElement.tsx | 22 | function isLegacySequentialVideoRef(value: string | undefined): boolean { |
| LOW | …er/Editor/Canvas/hooks/useInsertFromCreateSelection.ts | 5 | export function useInsertFromCreateSelection(viewportRef: RefObject<HTMLElement | null>) { |
| LOW | components/generation/generation-toolbar.tsx | 417 | function formatCompactThinkingValue(value?: string, t?: (key: string) => string) { |
| LOW | packages/pptxgenjs/src/gen-objects.ts | 1147 | export function addPlaceholdersToSlideLayouts(slide: PresSlide): void { |
| LOW | packages/pptxgenjs/src/gen-xml.ts | 819 | function slideObjectRelationsToXml (slide: PresSlide | SlideLayout, defaultRels: Array<{ target: string, type: string }> |
| LOW | packages/pptxgenjs/src/gen-xml.ts | 884 | function genXmlParagraphProperties (textObj: ISlideObject | TextProps, isDefault: boolean): string { |
| LOW | lib/server/resolve-model.ts | 88 | function getThinkingConfigFromBody(body: unknown): ThinkingConfig | undefined { |
| LOW | lib/server/provider-config.ts | 325 | export function canUseServerApiKeyForBaseUrl( |
| LOW | lib/server/provider-config.ts | 472 | export function getServerWebSearchProviders(): Record<string, { baseUrl?: string }> { |
| LOW | lib/server/provider-config.ts | 510 | export function resolveServerWebSearchProviderId(preferredProviderId?: string): string | undefined { |
| LOW | lib/server/classroom-job-runner.ts | 13 | export function runClassroomGenerationJob( |
| LOW | lib/server/classroom-media-generation.ts | 70 | export async function generateMediaForClassroom( |
| LOW | lib/server/web-search-config.ts | 31 | function assertWebSearchProviderId( |
| LOW | lib/server/web-search-config.ts | 37 | export function resolveSafeClientWebSearchBaseUrl( |
| LOW | lib/server/web-search-config.ts | 59 | export function resolveWebSearchRouteBaseUrl( |
| LOW | lib/server/web-search-config.ts | 67 | export function resolveClassroomWebSearchConfig(input: { |
| LOW | lib/server/classroom-job-store.ts | 100 | export async function createClassroomGenerationJob( |
| LOW | lib/server/classroom-job-store.ts | 122 | export async function readClassroomGenerationJob( |
| LOW | lib/server/classroom-job-store.ts | 137 | export async function updateClassroomGenerationJob( |
| LOW | lib/server/classroom-job-store.ts | 158 | export async function markClassroomGenerationJobRunning( |
| LOW | lib/server/classroom-job-store.ts | 180 | export async function updateClassroomGenerationJobProgress( |
| LOW | lib/server/classroom-job-store.ts | 194 | export async function markClassroomGenerationJobSucceeded( |
| LOW | lib/server/classroom-job-store.ts | 213 | export async function markClassroomGenerationJobFailed( |
| LOW | lib/server/search-query-builder.ts | 22 | function normalizeSearchRequirement(requirement: string): string { |
| LOW | lib/utils/geometry.ts | 11 | export function getElementPercentageGeometry( |
| LOW | lib/utils/stage-storage.ts | 191 | function isLegacySequentialVideoRef(value: unknown): value is string { |
| LOW | lib/utils/stage-storage.ts | 220 | export function revokeThumbnailSlideMediaUrls(slides: Record<string, ThumbnailSlide>) { |
| LOW | lib/utils/database.ts | 466 | export async function deleteStageWithRelatedData(stageId: string): Promise<void> { |
| LOW | lib/utils/database.ts | 493 | export async function getGeneratedAgentsByStageId( |
| LOW | lib/audio/voice-resolver.ts | 105 | export function getAvailableProvidersWithVoices( |
| LOW | lib/audio/voxcpm.ts | 75 | export function voxCPMBackendSupportsReferenceAudio(backend: VoxCPMBackendType): boolean { |
| LOW | lib/audio/voxcpm.ts | 91 | export function getVoxCPMProfileIdFromVoiceId(voiceId: string): string | null { |
| LOW | lib/audio/voxcpm.ts | 96 | function sanitizeAutoVoicePromptPart(value?: string): string { |
| LOW | lib/audio/voxcpm.ts | 105 | export function buildAutoVoxCPMVoicePrompt(context: VoxCPMVoicePromptContext = {}): string { |
| LOW | lib/audio/asr-providers.ts | 289 | function getOptionalBearerAuthHeaders(apiKey?: string): Record<string, string> { |
| LOW | lib/audio/voxcpm-voices.ts | 23 | function notifyVoiceProfilesChanged(): void { |
| LOW | lib/audio/voxcpm-voices.ts | 129 | export async function validateVoxCPMReferenceAudio(blob: Blob): Promise<void> { |
| LOW | lib/audio/voxcpm-voices.ts | 140 | export async function normalizeVoxCPMReferenceAudio( |
| LOW | lib/ai/providers.ts | 1129 | function getCompatThinkingBodyParams( |
| LOW | lib/ai/providers.ts | 1246 | function normalizeMiniMaxAnthropicBaseUrl( |
| LOW | lib/ai/providers.ts | 1264 | function shouldUseOpenAIResponsesApi(providerId: ProviderId, modelId: string): boolean { |
| LOW | lib/ai/llm.ts | 129 | function buildThinkingProviderOptions( |
| LOW | lib/ai/model-metadata.ts | 351 | export function getCatalogThinkingCapability( |
| LOW | lib/ai/thinking-config.ts | 13 | export function supportsConfigurableThinking( |
| LOW | lib/ai/thinking-config.ts | 103 | function defaultEffortForCapability(thinking: ThinkingCapability): ThinkingEffort | undefined { |
| LOW | lib/ai/thinking-config.ts | 107 | function defaultLevelForCapability(thinking: ThinkingCapability): ThinkingLevel | undefined { |
| LOW | lib/web-search/format.ts | 6 | export function formatSearchResultsAsContext(result: WebSearchResult): string { |
| LOW | lib/web-search/constants.ts | 66 | export function getWebSearchProviderDisplayName( |
| LOW | lib/orchestration/director-prompt.ts | 94 | function summarizeAgentWhiteboardActions(actions: WhiteboardActionRecord[]): string { |
| LOW | lib/orchestration/director-prompt.ts | 165 | export function summarizeWhiteboardForDirector(ledger: WhiteboardActionRecord[]): { |
| LOW | lib/orchestration/director-prompt.ts | 194 | function buildWhiteboardStateForDirector(ledger?: WhiteboardActionRecord[]): string { |
| LOW | lib/orchestration/prompt-builder.ts | 79 | function buildStudentProfileSection(userProfile?: { nickname?: string; bio?: string }): string { |
| 39 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 163 | const mark = editorView.current.state.schema.marks.fontname.create({ |
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 173 | const mark = editorView.current.state.schema.marks.fontsize.create({ |
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 186 | const mark = editorView.current.state.schema.marks.fontsize.create({ |
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 199 | const mark = editorView.current.state.schema.marks.fontsize.create({ |
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 208 | const mark = editorView.current.state.schema.marks.forecolor.create({ |
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 218 | const mark = editorView.current.state.schema.marks.backcolor.create({ |
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 318 | const mark = editorView.current.state.schema.marks.link.create({ |
| CRITICAL | …lide-renderer/components/element/ProsemirrorEditor.tsx | 336 | const mark = editorView.current.state.schema.marks.link.create({ |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | app/generation-preview/page.tsx | 243 | // Step 0: Parse PDF if needed |
| LOW | app/generation-preview/page.tsx | 808 | // Step 2: Generate content (currentStepIndex is already 2) |
| LOW | lib/pdf/mineru-cloud.ts | 232 | // Step 1: Create batch — request presigned upload URL |
| LOW | lib/pdf/mineru-cloud.ts | 262 | // Step 2: Upload PDF to presigned URL |
| LOW | lib/pdf/mineru-cloud.ts | 287 | // Step 3: Poll for completion |
| LOW | lib/audio/asr-providers.ts | 44 | * // Step 1: Upload audio file |
| LOW | lib/audio/asr-providers.ts | 69 | * // Step 2: Request transcription |
| LOW | lib/audio/asr-providers.ts | 84 | * // Step 3: Poll for completion |
| LOW | lib/hooks/use-scene-generator.ts | 341 | // Step 1: Generate content |
| LOW | lib/hooks/use-scene-generator.ts | 375 | // Step 2: Generate actions + assemble scene |
| LOW | lib/hooks/use-scene-generator.ts | 497 | // Step 1: Content |
| LOW | lib/hooks/use-scene-generator.ts | 517 | // Step 2: Actions |
| LOW | lib/hooks/use-scene-generator.ts | 545 | // Step 3: TTS |
| LOW | lib/orchestration/stateless-generate.ts | 150 | // Step 1: Find the opening `[` if not yet found |
| LOW | lib/orchestration/stateless-generate.ts | 161 | // Step 2: Check if the array is complete (closing `]` found) |
| LOW | lib/orchestration/stateless-generate.ts | 165 | // Step 3: Try incremental parse — jsonrepair first (fixes unescaped quotes), fallback to partial-json |
| LOW | lib/orchestration/stateless-generate.ts | 186 | // Step 4: Determine how many items are fully complete |
| LOW | lib/orchestration/stateless-generate.ts | 200 | // Step 5: Emit newly completed items |
| LOW | lib/orchestration/stateless-generate.ts | 234 | // Step 6: Stream partial text delta for the trailing item |
| LOW | lib/orchestration/stateless-generate.ts | 246 | // Step 7: Mark done if array is closed |
| LOW | lib/generation/scene-builder.ts | 87 | // Step 1: Generate content (with images if available) |
| LOW | lib/generation/scene-builder.ts | 111 | // Step 2: Generate Actions |
| LOW | lib/generation/action-parser.ts | 47 | // Step 1: Strip markdown code fences if present |
| LOW | lib/generation/action-parser.ts | 50 | // Step 2: Find the JSON array range |
| LOW | lib/generation/action-parser.ts | 61 | // Step 3: Parse — try JSON.parse first, then jsonrepair, fallback to partial-json |
| LOW | lib/generation/action-parser.ts | 88 | // Step 4: Convert items to Action[] |
| LOW | lib/generation/action-parser.ts | 123 | // Step 5: Post-processing — discussion must be the last action, and at most one |
| LOW | lib/generation/action-parser.ts | 129 | // Step 6: Filter out slide-only actions for non-slide scenes (defense in depth) |
| LOW | lib/generation/action-parser.ts | 139 | // Step 7: Filter by allowedActions whitelist (defense in depth for role-based isolation) |
| LOW | lib/media/adapters/minimax-video-adapter.ts | 160 | // Step 1: Submit task |
| LOW | lib/media/adapters/minimax-video-adapter.ts | 163 | // Step 2: Poll until complete |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | lib/types/generation.ts | 97 | // AI-generated media requests (when PDF images are insufficient) |
| HIGH | lib/utils/database.ts | 319 | // Version 8: Add generatedAgents table for AI-generated agent profiles |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | lib/hooks/use-canvas-operations.ts | 181 | // Copy selected element data to clipboard |
| LOW | lib/generation/json-repair.ts | 141 | let fixed = jsonStr; |