Spaces:
Sleeping
Sleeping
Commit History
-
Improve mobile header and participants dropdown UX.
Jordan Miller +1: CursorAdd a header overflow menu on narrow screens, show the participants picker as a bottom sheet, and surface Create Expert Persona at the top of the dropdown with updated helper copy. Co-authored-by: Cursor <cursoragent@cursor.com>958ebfa -
Add demo trio personas and polish empty-state panel UX.
Jordan Miller +1: CursorIntroduce Elena, Marcus, and Dr. Amira as default catalog participants with a build-vs-buy sample preview, dynamic empty-state guidance, readable bubble text, and sidebar prompt display fixes; reassign Marcus to Mistral after Fireworks DeepSeek v3.2 404s locally. Co-authored-by: Cursor <cursoragent@cursor.com>4944128
-
Load cross-project shared.env before project .env for local dev.
Jordan Miller +1: CursorAuto-detect secrets at ~/.secrets/shared.env or ~/Downloads/shared.env so API keys stay outside the repo while docker-compose and dev-local.sh can opt in via SHARED_ENV_FILE. Co-authored-by: Cursor <cursoragent@cursor.com>40dee71
-
Harden Expert Persona builder and add model suggestion.
Jordan Miller +1: CursorRoute role-prompt generation through a neutral writer model to prevent Neon character identity bleed, and add a suggest-model flow that prioritizes the user's source description over the generated prompt. Co-authored-by: Cursor <cursoragent@cursor.com>1961f74
-
Merge pull request #5 from NeonClary/dev-cursor
NeonClaryUnverified signatureDev cursor1c62c48 -
fix(ui): set browser tab title to CCAI Demo
NeonClary +1: CursorReplace the generic AI-to-AI conversations label so the tab hover text matches the product name. Co-authored-by: Cursor <cursoragent@cursor.com>a2c8495 -
fix(ui): equalize table view opinion column widths
NeonClary +1: CursorGive the four right-hand summary columns matching widths so the table layout stays balanced when opinion text varies in length. Co-authored-by: Cursor <cursoragent@cursor.com>c3b9066
-
Build credentials during Phase 1 and streamline human participant setup.
NeonClary +1: CursorGenerate per-participant credentials concurrently with initial opinions, rebuild only on model changes, and let humans join from profile text with background credential generation—no question required upfront. Also refresh chat-start controls, rate-limit notices, and header layout. Co-authored-by: Cursor <cursoragent@cursor.com>d4017c8 -
perf(orchestrator): prefetch human-phase opinions and tighten context budget
NeonClary +1: CursorFire all LLM initial-opinion calls in parallel while waiting on the human participant, compress embedded transcript blocks when over budget, surface phase banners and inline system notes in the chat timeline, and propagate Neon vLLM error metadata for resilience. Co-authored-by: Cursor <cursoragent@cursor.com>9a51d6a
-
fix(personas): surface Neon HANA persona prompts in the sidebar
NeonClaryThe participant catalog dropped HANA system_prompt, so Neon models showed (no prompt set). Forward prompts from HANA and resolve them in the UI when a Neon model is the effective LLM.d58dc6d
-
Merge pull request #4 from NeonClary/dev-cursor
NeonClaryUnverified signatureImprove speed, add alternate conversation methods05146ff -
chore: drop stray COMMIT_MSG.txt artifact
NeonClary +1: CursorCo-authored-by: Cursor <cursoragent@cursor.com>bc16be0 -
perf(orchestrator): parallel phases, streaming, early table summaries
NeonClary +1: Cursor- Parallel participant turns in Phases 1/2/4 via orchestrator_speed.run_roster_ai_turns_parallel - SSE token streaming on consensus + targeted follow-up turns (message_stream_start / message_delta) - Parallel ballot collection in majority / ranked-choice / Robert's Rules votes - Heuristic-first addressed_to classifier skips most LLM calls - Compact rolling transcript for orchestrator judge prompts (cached per session) - Fast orchestrator model (gemini-2.0-flash) for lightweight classifier calls - Lazy contribution summaries kicked off after Phase 4 so Table View loads instantly - Conditional Phase-3 credential refresh only when follow-ups are needed - max_tokens 4x multiplier limited to thinking models Co-authored-by: Cursor <cursoragent@cursor.com>83add3c -
fix(ui): honor disabled human in auto-select; rename Transparency to View Prompts
NeonClary +1: CursorAuto-select no longer prepends a human participant when they are turned off in the sidebar, and buildStartPayload always filters by enabledMap even when an override list is supplied. Rename the Settings accordion header from Transparency to View Prompts. Co-authored-by: Cursor <cursoragent@cursor.com>de1db91 -
feat(conversation): pluggable structures + decision methods (Robert's Rules, ranked-choice, majority)
NeonClary +1: CursorThe orchestrator is now structured as ConversationStructure → DecisionMethod plugins joined by a standardized DecisionInput contract. The existing six-phase flow is preserved as CollaborativeDiscussion + ConsensusDecision (unchanged behavior); three new decision methods (MajorityRulesDecision, RankedChoiceDecision, RobertsRulesVote) and one new structure (RobertsRulesDiscussion) are wired into the registry. Adding a new structure or decision method now means dropping a class into backend/app/services/conversation/{structures,decisions}/ and adding one line to the registry. Backend - New package backend/app/services/conversation/ with base classes, DecisionInput contract, and a get_structure/get_decision registry resolver (defaults: collaborative + consensus, so older /chat/start payloads keep working). - CollaborativeDiscussion + ConsensusDecision are thin wrappers over the original _phase_* functions in orchestrator.py — zero behavior change for the default path. - RobertsR…e661e91 -
feat(resilience): multi-tier participant failure recovery + Response-priority toggle
NeonClary +1: CursorWhen a participant's LLM call fails, the orchestrator now has a real recovery cascade instead of silently dropping the turn and relying solely on auto-disable-after-N-failures. The behaviour is gated on the new "Response priority" setting in the Settings menu, which mirrors the LLMChats3 toggle that used to live there: under "Prioritize model choice" (default) we preserve the user's chosen model and just note failures in chat as today, relying on the existing 2-attempt HTTP retry in openai_compat for the "always a second try" guarantee. Under "Prioritize conversation speed" we additionally race the chosen model against a fast fallback (existing logic in clients/llm_router.py) and then layer the new cascade on top. Backend - clients/openai_compat.py: classify failures as transient (5xx, 429, 408, 425, timeouts, connection errors) vs permanent (4xx auth/invalid/content-filter/404) and propagate via new error_kind / error_status fields on the result dict. - clients/llm_…cdef1a0 -
refactor(ui): shorten Settings menu — accordions + Model Selection merge
NeonClary +1: CursorThe Settings panel had grown long enough that scanning it required scrolling. Three changes to make it manageable: - Drop the Downloads section at the bottom. Every item it offered (chat .txt, chat .md, summary .csv) is already in the header DownloadMenu; duplicating them here was just noise. Removed the corresponding props from DevMenu and from the Header forwarding. - Convert each multi-item category (Model Selection, Display options, Transparency) into a collapsible accordion that defaults to closed. Added a new SectionHeader subcomponent and matching .dev-panel-section-header CSS that mimics the existing .dev-panel-label styling so collapsed sections still read as plain uppercase labels. Single-item categories (Theme, Max participants, Advanced) stay inline since collapsing a one-item section would just add a click without saving any vertical space. - Merge the old "Models" and "Participants" categories into a single "Model Selection" accordion containing Orc…d38c4fe -
feat(ui): header cleanup + Table View shortcut + post-chat downloads strip
NeonClary +1: Cursor- Header: drop the redundant 'Human: ' prefix on the human-participant button; the sidebar already labels the entry as Human, so the prefix was just visual noise. - Header: add a dedicated 'Table View' button that opens the same Summary Table modal as the Settings menu item, so users don't have to dig through a dropdown to view it. - ChatArea: after 'End of Chat', render a row mirroring every item in the header DownloadMenu (Summary table view, .txt, .md, summary .csv, full API history). The row stacks vertically on phones for full-label readability. - ParticipantSidebar: remove the 'Drag to reorder is not supported yet...' note; reordering isn't on the roadmap and the message just cluttered the sidebar header. Co-authored-by: Cursor <cursoragent@cursor.com>53edcb8 -
Merge pull request #3 from NeonClary/master
NeonClaryUnverified signatureMerge in even though I see no files changed112b786
-
Merge pull request #2 from NeonClary/dev-cursor
NeonClaryUnverified signatureDev cursor80e3a9e -
feat: human participant turns + credential intake redesign
NeonClary +1: CursorHuman Participant: new human_io service and HumanInputSlot/HumanParticipantModal/HumanTurnIndicator UI; orchestrator and chat API support human turns; ParticipantSidebar/ChatArea/MessageBubble wiring. Credential intake: new credential_intake prompt, expanded credential service, redesigned Credential Summary modal, prompt registry entry. Supporting: App state and routing for human turns + credentials, Header surface, ccai.css styling for new components, api/storage helpers. Co-authored-by: Cursor <cursoragent@cursor.com>11bf9b7
-
chore: remove Max Participants debug instrumentation (verified working)
NeonClary +1: CursorReverts the temporary fetch()-based debug instrumentation added in a808caa (the "Debug instrumentation" section of that commit's message): * frontend/src/App.js (handleMaxParticipantsChange): - Removed the `// #region agent log` POST to 127.0.0.1:7660 that forwarded n / clamped / prev maxParticipants state to the local debug server. - Reverted the useCallback deps from [selectedIds, maxParticipants] back to [selectedIds]; `maxParticipants` was only in the deps because the instrumentation closed over it. * frontend/src/components/DevMenu.js: - Removed the panel-open render-snapshot useEffect that POSTed to 127.0.0.1:7660. - Restored the +/- stepper button onClick handlers to their original one-liner form (Math.max(3, ...) / Math.min(9, ...)), removing the wrapped click handlers that POSTed click-snapshots to the debug server. All non-instrumentation changes from a808caa (DownloadMenu split, Header prop wiring fix for maxParticipants, settings-m…0239f6d -
feat(ui): consolidate downloads, move theme into settings, restructure & darken settings menu, fix max-participants prop wiring
NeonClary +1: CursorHeader * Replace the standalone Sun/Moon button + the four-button download strip with a single Download dropdown (DownloadMenu.js). Members: View summary table, Chat .txt, Chat .md, Summary table .csv, and Full API history (the only download that lives only here). * Header now passes every prop to DevMenu explicitly. The previous '...devProps' rest spread silently dropped 'maxParticipants' because Header was destructuring it for ParticipantDropdown's use, leaving DevMenu's stepper to compute Math.max(3, undefined - 1) = NaN on every click. With explicit wiring the stepper receives a real number; the +/- buttons update state again. Settings menu (DevMenu.js) * New top item: Theme toggle (Sun/Moon flips Switch to dark/light mode label). * Every category's items are now indented to match the old Display Options pattern, so the small uppercase category labels read as headers. * Models / Per-participant rows render two-line: name on top, currently-selected model on a second line, elli…a808caa -
chore(gitignore): exclude docker-compose.dev-cursor.yml
NeonClary +1: CursorLocal parallel-stack override for running the dev-cursor branch alongside master on the same host (different ports + shared secrets file path). Same workstation-only nature as docker-compose.override.yml; ignore it the same way. Also drops the duplicate .commit-msg.txt entry that snuck in. Co-authored-by: Cursor <cursoragent@cursor.com>c430435 -
Merge pull request #1 from NeonClary/dev-cursor
NeonClaryUnverified signatureAdding better chat formatting, menu items, title change & moref932645 -
chore: remove HANA Security verification probe
NeonClary +1: CursorVerification confirmed BrainForge/Security@2026.03.18 is served identically to every other Neon model via the standard HANA path (auth/login -> get_models -> get_personas -> get_inference). The probe was a one-shot diagnostic; its job is done. The findings live in commit beaa024's history if we ever need to rerun the experiment. Co-authored-by: Cursor <cursoragent@cursor.com>bbab75f -
feat(transparency): Download as .txt button in Credential Summary
NeonClary +1: CursorMirrors the existing PromptCatalogModal download affordance so the two transparency modals look like a matched set. Button sits to the right of Refresh in the Credential Summary header, disabled until a summary has been generated. The downloaded .txt uses the same banner/separator style as the prompt-catalog dump and includes the question, each participant's name, credibility score, expertise, style, and bias-to-watch. Co-authored-by: Cursor <cursoragent@cursor.com>bb08a9f -
test: probe BrainForge/Security via standard HANA path
NeonClary +1: CursorOne-shot diagnostic that exercises /auth/login, /brainforge/get_models, /brainforge/get_personas, and /brainforge/get_inference using only the default HANA_USERNAME/HANA_PASSWORD - i.e. the same path every other Neon model uses - and writes per-step evidence to a debug log so we can confirm the 4090-x1-3 host now serves Security identically (no klatchat creds, no direct vLLM bypass). Run with: docker compose exec app python /home/user/app/probe_security_via_standard_hana.py Co-authored-by: Cursor <cursoragent@cursor.com>beaa024 -
build: BuildKit cache mounts + .dockerignore + cursor rule
NeonClary +1: CursorDockerfile opts into BuildKit (# syntax=docker/dockerfile:1.7) and mounts persistent caches at /root/.npm and /home/user/.cache/pip so npm and pip downloads survive across rebuilds. First build is unchanged; subsequent rebuilds skip the network for unchanged dependencies. .dockerignore narrows the build context (drops .git, .cursor, node_modules, build outputs, Python/Node caches, .env files, backend/tests, etc.) so the daemon does not ship hundreds of MB of local-dev cruft to the builder on every build. .cursor/rules/docker-build.mdc captures the conventions (syntax directive, cache mount targets, no --no-cache-dir, build context narrowing) so future agents reuse the same pattern instead of regressing. Co-authored-by: Cursor <cursoragent@cursor.com>2011737 -
fix(frontend): default API_BASE to '' so Docker builds use same-origin
NeonClary +1: CursorWhen REACT_APP_API_URL is unset (the typical case for the Docker build, where Dockerfile already passes REACT_APP_API_URL=), the bundle now resolves API_BASE to '' (relative URLs) instead of hardcoding http://localhost:8000. Previously a host-side pm run build without that env var silently baked the localhost URL into the bundle, causing every API call from a Docker deployment served on a different port (3002/8002/7860) to fail with CORS or refuse the connection - which is what produced the empty Persona dropdown in earlier sessions. Inline comment documents the dev-server escape hatch (REACT_APP_API_URL=http://localhost:8000 in .env.development) for the CRA pm start workflow. Co-authored-by: Cursor <cursoragent@cursor.com>69d90be -
settings: drop Response Priority, make dev panel scrollable
NeonClary +1: CursorRemoves the "Prioritize model choice / Prioritize conversation speed" toggle from the settings menu (and its plumbing in App.js and the speedPriority/setSpeedPriority handlers) - the racing logic is no longer surfaced as a user choice. Caps the settings dropdown at calc(100vh - 80px) with overflow-y: auto so the menu always fits in the viewport and long content scrolls inside the panel instead of bleeding off the bottom. Co-authored-by: Cursor <cursoragent@cursor.com>6cac4f0 -
rename: 'CCAI Vibe Demo' -> 'Collaborative Conversational AI (CCAI) Demo'
NeonClary +1: CursorUpdates the user-visible product name everywhere it surfaced as a string: README frontmatter + H1, FastAPI app title, header H1, prompt-catalog download banner, and the additive-styles file header. No behavior change. Co-authored-by: Cursor <cursoragent@cursor.com>6a3a7e1
-
feat(transparency): add "View current chat prompts" to settings
NeonClary +1: CursorNew PromptCatalogModal under Settings -> Transparency lists every prompt template the orchestrator and participants use, grouped by phase, with a 1-2 sentence purpose for each, the runtime template variables, and a copy-to-clipboard button per prompt. Powered by a new GET /api/chat/prompts/catalog endpoint and a hand-curated backend/app/services/prompts/catalog.py. Header includes a "Download as .txt" button that produces a flat ccai-prompts-*.txt dump. Co-authored-by: Cursor <cursoragent@cursor.com>478df90 -
feat(participants): add "Select N Automatically" option
NeonClary +1: CursorWhen the user picks the new top-of-dropdown "Select N Automatically" option, the trigger label switches to "Participants Auto Selected" and manual persona checkboxes are hidden. Clicking either start button calls a new /api/chat/auto-select-participants endpoint that uses the orchestrator LLM to rank all available candidates by relevance to the question, populates the sidebar with the top N, then proceeds with /chat/start as usual. Manual selection is restored if auto mode is turned back off. Co-authored-by: Cursor <cursoragent@cursor.com>af5d1df -
feat(limits): expose repetition / failsafe limits in settings menu
NeonClary +1: CursorHard-coded repetition counts in orchestrator (critique rounds, status-assessment iterations, consensus turn budget, dyad cap, stall recovery, auto-disable threshold) and the failsafe pause points are now driven by a `ConversationLimits` dataclass on `Session`. Defaults match the historical values; the API layer clamps user-supplied overrides to per-field bounds. Frontend: new "Conversation limits..." item under an "Advanced" section in the settings menu, opens a modal with steppers + descriptions grouped into Discussion structure / Reliability / Failsafes. Overrides persist via localStorage and ride along on /chat/start. Backend: GET /api/chat/limits/defaults serves defaults + bounds + descriptions so the modal is server-driven; new test_conversation_limits.py covers clamping behavior and endpoint shape (60 backend tests pass). Co-authored-by: Cursor <cursoragent@cursor.com>1ec996f -
data: replace personal_health_diet demo prompt with four_day_workweek
NeonClary +1: CursorSwap the diet-overhaul question for a business-focused 4-day work week question (220-person professional-services firm, COO POV) so the default demo bank is consistently business / management / civic scenarios instead of mixing personal-health cases. Co-authored-by: Cursor <cursoragent@cursor.com>7223f36 -
Surface Credential Summary in settings + exports
NeonClary +1: CursorAdd a transparency section so users can see and download the orchestrator-generated Credential Summary (per-participant expertise, debating style, credibility on this question, biases to watch). Built after Phase 1 and refreshed once after Phase 2. Backend: - New GET /api/chat/{session_id}/credentials endpoint. - Credentials block included in TXT and MD exports after the participants list, omitted cleanly when the summary isn't built yet. - CSV table gains four columns (Expertise, Style, Credibility 0-1, Bias to watch) inserted between Participant and First opinion so the row reads as a self-contained narrative. - New `credentials_updated` SSE event fires after the Phase-1.5 build and after the Phase-3 refresh (only when the payload actually changes), so the frontend can cache the latest snapshot without polling. Frontend: - New CredentialSummaryModal: per-participant cards with name, expertise, style, bias, and a 0-1 credibility bar. - "View Credential Summary..." it…64d902c -
Tighten CCAI conversation flow and visual threading
NeonClary +1: CursorThe CCAI demo's first end-to-end runs surfaced several UX and prompt issues. This commit addresses them across the orchestrator, prompt templates, transport, and chat UI. Conversation flow: - Each per-speaker prompt (CRITIQUE, FINALIZATION, CONSENSUS_ALLIED, CONSENSUS_SOLO) now opens with an "Open threads directed at you since your last turn" block populated by `_pending_addressed_for`. The templates instruct participants to address those threads FIRST, then their phase-specific contribution. Dropped CONSENSUS_TARGETED_RESPONSE in favor of this unified path. - Status-assessment follow-ups use a hybrid prompt: orchestrator prefers surfacing unanswered participant-to-participant questions verbatim (attributed to the asker) and only synthesizes its own when none exist. New `asker_participant_id` field in the JSON output. - Consensus phase caps consecutive addressed-to (dyadic) routings at 2 before forcing a round-robin pick, so two participants can't monopolize the fl…a763505 -
Make local docker compose port-overridable; fix lockfile drift
NeonClary +1: Cursor- docker-compose.yml: host port now reads from ${CCAI_HOST_PORT:-7860} so local devs can sidestep port conflicts (e.g. set CCAI_HOST_PORT=3002 in .env) without editing the compose file. Default stays 7860 for HuggingFace Space parity. - Dockerfile: frontend stage bumped from node:20-alpine to node:22-alpine so the in-container npm matches the host npm 11 that maintains the lockfile. Without this, npm ci inside the container failed with a "Missing yaml@2.9.0 from lock file" lockfile-drift error. - frontend/package-lock.json: regenerated cleanly so `npm ci` is reproducible across hosts. - .gitignore: ignore docker-compose.override.yml (used for local-only port + env_file overrides) and the transient .commit-msg.txt buffer. Co-authored-by: Cursor <cursoragent@cursor.com>e03c7d3 -
Build CCAI Vibe Demo on top of LLMChats3 baseline
NeonClary +1: CursorMulti-participant Collaborative Conversational AI demo: the orchestrator runs a six-phase state machine (Initial Opinions, Critique x2, Status Assessment, Finalization, Consensus, Closure), produces a JSON Credential Summary keyed on credibility-for-question, and routes addressed-to messages through alliance detection. Two failsafes - 60+20 participant messages and 100+50 orchestrator calls - pause the loop until the user clicks Continue. Every LLM response is funneled through a centralized strip_thinking sanitizer before being stored, displayed, or fed back to the summarizer. Backend - New: services/{models,prompts/*,credential,consensus,context_budget, json_calls,extra_personas,orchestrator}.py, utils/sanitize.py, api/personas.py, data/demo_questions.json (10 long-context prompts). - Rewrote api/chat.py with /chat/start (N participants, summarizer + max-participants overrides), /chat/{id}/continue, table-view + csv-table exports. - Rate limit bumped to 30/day per IP; HF org …0bb4dfa -
Import LLMChats3 master as CCAI baseline
NeonClary +1: CursorCo-authored-by: Cursor <cursoragent@cursor.com>c44fab6