- orchestrationApi: pdf/docx/txt → Agentic v2 (VITE_AGENTIC_API_BASE_URL); csv/xlsx → Go v1 (VITE_ORCHESTRATION_API_BASE_URL); delete stays v1
- MarkdownContent: extract asset://<id> markers, batch ≤50 via /api/v2/document/image-token, render signed URLs
- KnowledgeManagement: pass fileType to processDocument for correct routing
- MessageList, AnalysisShell, ReportSidebar: thread userId/analysisId for image token calls
- vite-env.d.ts: add VITE_AGENTIC_API_BASE_URL type
15 days ago
[NOTICKET] Repointing knowledge pipeline from v1 (go) to v2 (paddleocr based)
harryagasi
f797178
[KM-717][DED][FE] User can add data dictionary for database source
harryagasi
3aeb97e
feat: add Classify column (Dimension/Measure) to Data Dictionary with conditional Aggregation
- DataDictionaryForm.tsx: add CLASSIFY_OPTIONS (Dimension, Measure); Aggregation dropdown now disabled unless Classify="Measure"
- alert-dialog.tsx: add overflowWrap: "anywhere" to AlertDialogTitle for long filenames
fix(upload file): drag and drop file
harryagasi
e9814c9
[NOTICKET] feat(knowledge,analysis): add deletion confirmation, duplicate-name guard, and unusable-analysis lockout
harryagasi
3baad7e
- Require confirmation with an impact preview (affected analyses) before
deleting a knowledge source or clearing all documents in KnowledgeManagement
- Block creating analyses with a name that duplicates an existing one
(case/whitespace-insensitive) in NewAnalysisDialog
- Derive an "unusable" state from the existing staleSources check and disable
chat input/send/help, suggested questions, generate-report, and the
source-rebind controls in AnalysisHeader once a bound source is deleted,
while keeping chat history and reports viewable
feat: fetch and render charts for chat answers via /api/v1/charts
harryagasi
b5e46e4
- Add getCharts client and ChartSpec/ChartItem/ChartsResponse types
- Auto-fetch charts for each completed AI message once message_id is known, mirroring the existing traceability fetch pattern
- Treat empty/not_found chart status as silent no-op (no error shown); log not_found for debugging only
- Render fetched charts under the assistant bubble reusing PlotlyChartBlock from report rendering
feat: render plotly charts embedded in report markdown
harryagasi
1db9b28
- Add PlotlyChartBlock component that lazy-loads plotly.js-dist-min + react-plotly.js so the ~1.5MB gzip payload only loads when a report actually contains a chart
- Detect ```plotly fenced code blocks in MarkdownContent, parse the JSON spec, and render an interactive chart instead of raw code text
- Add plotly.js-dist-min, react-plotly.js, and their type packages as dependencies
feat: sort analyses by updated_at, render data_used in traceability
harryagasi
98ca5fc
- Sort analysis list by updated_at (desc) on load, select, create, and data-bind update
- Add data_used field to traceability response type and render it in a dedicated section
- Move tool calls behind a collapsible "Details" section instead of showing inline
- Update API contract docs for soft-delete analysis behavior and traceability data_used/tool_calls fields
Adds a persistent chip strip above the chat input so business-question
suggestions stay clickable after the first message instead of disappearing,
merges the header's source-count pill and Edit sources button into one
control, and fixes disabled database-type logos being nearly invisible in
dark mode by extending the existing .knowledge-surface dark override.
[noticket] feat: add sortable column in table component
Adds drag-resize + fullscreen to the report sidebar, fixes a min-h-screen
layout bug in AppNavigation that pushed the chat input/footer out of view
as the analysis list or message history grew, replaces the empty-conversation
notice with business-question starter buttons, caps business questions to
2-5 at creation time, and simplifies the conversation header to a single
compact row.
fix: handle failed AI message persistence per updated Go contract
harryagasi
587748b
Backend now returns 201 with status:"failed" and a reserved all-zero
message_id when an AI message is saved without a valid message_id,
instead of a request error. Surface this as an error bubble and skip
calling traceability with the reserved id.
fix: update traceability endpoint, remove retry logic, and fix report stale version
harryagasi
e2da2f6
- Update GET traceability path from /api/v1/observability to /api/v1/traceability
- Remove 3x retry logic on 404: contract guarantees row is written before done event
- Update 404 error message to "Traceability not available for this answer"
- Remove unused wait helper
- Use message_id from API response (savedUi.messageId) instead of doneMessageId
from agentic stream, now that Golang backend returns message_id in POST/GET responses
- Fix ReportSidebar stale selectedVersion: reset versions and selectedVersion
synchronously on analysis change to prevent cross-analysis 404 report requests
- Update API_CONTRACT_BE_PYTHON.md to reflect endpoint and behavior changes
fix: improve analysis chat rendering, scroll, and traceability persistence
harryagasi
eb3bd3c
- Fix bold markdown not rendering: reorder repairMarkdownMarkers so
space-adding runs before trim, preventing trim from being undone
- Apply same fix to normalizeAssistantContent before saving to DB
- Add auto-scroll to bottom on send, scroll to top of AI answer on
stream complete
- Tighten markdown spacing (my-3→my-1.5, leading-7→leading-6, space-y-2→space-y-0.5)
- Fix traceability disappearing on page refresh by using message_id
returned from API (now provided by backend) instead of hardcoding
doneMessageId from the agentic stream
chore: remove mojibake
harryagasi
f3f70dc
fix: stabilize analysis chat rendering and traceability
harryagasi
f18b03d
- Preserve leading spaces in Python SSE stream chunks
- Improve AI markdown rendering, spacing, wrapping, and malformed bold handling
- Persist cleaned assistant answers to Golang message history
- Rehydrate traceability after refreshing saved conversations
- Keep chat input fixed while only the message list scrolls
- Silence empty report-version lookup errors before report generation
- Improve dark-mode contrast for emerald surfaces
feat: refine analysis workspace navigation and theming
harryagasi
9932e86
- Move analysis creation and saved analysis list under Analysis Agent menu
- Add collapsible desktop sidebar and dark mode support
- Keep login page light-only with readable input text
- Flatten Knowledge page layout and improve dark mode styling
- Update Python chat contract to return message_id from backend
feat: polish workspace navigation and PWA branding
harryagasi
0b6365f
- add PWA manifest, service worker, and install icons
- improve mobile navigation and report panel behavior
- update login and sidebar branding to use public logo
- remove admin diagnostics from home dashboard
- rename package scope to @btech/dataeyond
- Show pulsing orange button when a DB has never been ingested to prompt user action
- Revert to muted style after first ingest, with relative timestamp ("5m ago", "2h ago") below the button
- Persist ingest timestamps per client in localStorage (km_ingest_timestamps)
- Fix incorrect toast message referencing non-existent chunks_ingested field; now shows table count from IngestResponse
[NOTICKET] [DED][FE] Fix analytics chat formatting and message persistence for cached responses
- Clear streamingMsgId immediately on SSE "message" event so cached responses
render with preprocessMarkdown applied (proper table/markdown formatting)
- Guard loadRoomMessages against overwriting local messages when backend returns
empty array — preserves chat history when backend does not persist cached LLM responses
- Add null-safety on detail?.messages to prevent TypeError on null API response
ticket: https://bukittechnology.atlassian.net/browse/KM-475
- Align api.ts and interviewApi.ts with latest API contract (endpoint paths,
request/response shapes, error envelope, DocumentStatus types)
- Revert document upload to multipart/form-data; remove putFileToAzure (SAS flow)
- Replace fetch with XMLHttpRequest in uploadDocument to support onProgress callback
- Add upload progress bar (% indicator) in KnowledgeManagement UI
- Add post-process polling: after /process returns 202, poll GET /documents
every 3s until status resolves to completed or failed
- Add timing logs for /upload and /process endpoints for performance diagnostics
- Re-fetch room messages from API after stream completes to ensure
rendered content matches stored content (fixes formatting not matching
page-refresh behavior)
- Skip preprocessMarkdown during active streaming to prevent regex
processing incomplete markdown chunks
- Add title attribute to document filename for full name on hover
tikcet: https://bukittechnology.atlassian.net/browse/KM-476
- Implement connectDatabase, getDatabaseClientTypes, getDatabaseClients,
deleteDatabaseClient, and ingestDatabaseClient in api.ts with correct
request/response shapes per API contract
- Add DbTypeField, DbTypeInfo, DatabaseClient, and IngestResponse types;
remove placeholder PostgresCredentials and ConnectDatabaseResponse
- Replace hard-coded DB_TYPES with dynamic fetch from GET /dbtypes endpoint
- Add "Connection Name" required field to credentials form
- Render form fields dynamically from API schema (supports all db_type variants:
postgres, mysql, supabase, sqlserver, bigquery, snowflake)
- Refresh connection list from GET /database-clients/{user_id} after connect
to confirm persisted data from backend
- Add "Databases" section in main view listing connected clients with
Ingest and Delete actions per connection
[KM-476] [DED][FE] Knowledge (Document and DB) Flow Page
ticket: https://bukittechnology.atlassian.net/browse/KM-476
- Implement connectDatabase, getDatabaseClientTypes, getDatabaseClients,
deleteDatabaseClient, and ingestDatabaseClient in api.ts with correct
request/response shapes per API contract
- Add DbTypeField, DbTypeInfo, DatabaseClient, and IngestResponse types;
remove placeholder PostgresCredentials and ConnectDatabaseResponse
- Replace hard-coded DB_TYPES with dynamic fetch from GET /dbtypes endpoint
- Add "Connection Name" required field to credentials form
- Render form fields dynamically from API schema (supports all db_type variants:
postgres, mysql, supabase, sqlserver, bigquery, snowflake)
- Refresh connection list from GET /database-clients/{user_id} after connect
to confirm persisted data from backend
- Add "Databases" section in main view listing connected clients with
Ingest and Delete actions per connection