Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
e9540f9
Convert Echo provider layer to multi-turn messages
dradis-bot Jul 14, 2026
4ae1500
Apply suggestion from @aapomm
etdsoft Jul 22, 2026
2c59ba7
Echo: fix dangling brace left by the applied gemini.rb do...end sugge…
Jul 22, 2026
ae0ab4f
Echo: add Session and Message persistence
dradis-bot Jul 14, 2026
cf09934
Echo: align migration foreign_key hash keys for rubocop
dradis-bot Jul 14, 2026
4969d63
Echo: cascade session cleanup via Sessionable concern not a Note monk…
Jul 17, 2026
c972bb4
Echo: apply PR #1649 Slice-2 review resolutions (aapomm)
Jul 22, 2026
03498bf
Echo: apply caitmich Slice-2 review (SEC-571 Part A)
Jul 31, 2026
cf88f49
Echo: replace InteractionJob with ReplyJob and generation state machine
dradis-bot Jul 14, 2026
e659993
Echo: spec ReplyJob and Session#request_reply! locking
dradis-bot Jul 14, 2026
a93d4de
Echo: keep InteractionJob alongside ReplyJob this slice
dradis-bot Jul 15, 2026
8231ce1
Echo: send only completed turns and sanitise failed replies
Jul 17, 2026
aa5800b
Echo: apply PR #1649 Slice-2 review resolutions (aapomm)
Jul 22, 2026
19b458f
Echo: apply PR #1650 review — array Turbo targets, model_override.pre…
Jul 24, 2026
c8b6628
Echo: apply caitmich Slice-3 review — resolved_model, drop dead proje…
Jul 31, 2026
a630e9b
Echo: keep Session#project as the authorization seam
Jul 31, 2026
4f71959
Echo: stop ReplyJob shadowing ActiveJob#serialize so it can enqueue
dradis-bot Jul 15, 2026
002e235
Echo: add session controllers, routes and re-authorizing sockets channel
dradis-bot Jul 15, 2026
1f5e42f
Echo: defer initial reply generation until the client subscribes
dradis-bot Jul 16, 2026
ecfd8c4
Echo: harden session controller — blank prompt, dead index, cable check
Jul 17, 2026
86d6d25
Echo: convert request-spec brace blocks to do...end for Style/BlockDe…
Jul 22, 2026
c6b6583
Echo: apply Slice-4 review resolutions (channel rescue, record scopin…
Jul 24, 2026
7bc671b
Echo: authorize socket subscriptions via session.project
Jul 31, 2026
6c4141e
Echo: apply caitmich review — only: Session, role callback, generaliz…
Jul 31, 2026
7c178fa
Echo: extract HasSession concern, scope routes under projects module,…
Jul 31, 2026
4bd83cf
Echo: extract session messages partial, drop redundant session-link p…
Jul 31, 2026
6acb912
Echo: build the session conversation views and message styling
dradis-bot Jul 16, 2026
774069d
Echo: make the Echo tab frame mechanism consistently native
dradis-bot Jul 16, 2026
7b3a928
Echo: tolerate turbo-rails' injected request_id local in broadcast pa…
dradis-bot Jul 16, 2026
5b93a01
Echo: mark reply-pending on show and add SEC-506 conversation feature…
dradis-bot Jul 16, 2026
51a5486
Echo: tokenize session avatar foreground and size it in rem
Jul 17, 2026
edfa32d
Echo: move SEC-506 conversation specs to the spec slice (5b)
Jul 17, 2026
c46d196
Echo: sanitise failed-message view, fix conversations N+1, drop dead …
Jul 17, 2026
ba69f54
Echo: lock composer on reply_pending so a fresh session disables Send
Jul 17, 2026
ca41466
add the missing field-sizing-content utility class
MattBudz Jul 20, 2026
5904fbc
redesign the Echo tab: two-column layout with per-column headings
MattBudz Jul 20, 2026
26d65df
extract the Echo conversations column into a shared partial
MattBudz Jul 20, 2026
306c342
show the conversations sidebar with an active state on an open session
MattBudz Jul 20, 2026
ee2cea8
remove redundant Echo tab title coverage from spec suite
MattBudz Jul 20, 2026
af682c6
widen the Echo conversations column to fit session timestamps
MattBudz Jul 20, 2026
f24652b
Echo: reconcile Slice-5 views onto Slice-4 controllers (SEC-571)
Jul 31, 2026
b925509
redesign the session list item: small spinner next to title, keep che…
MattBudz Aug 3, 2026
cea9437
Echo: add session Stimulus controller and feature coverage
dradis-bot Jul 16, 2026
4505e3e
Re-trigger CI for flaky node-merger attachment spec (unrelated to slice)
dradis-bot Jul 16, 2026
461078b
Echo: trigger initial reply from the session controller once subscribed
dradis-bot Jul 16, 2026
de8300b
Echo: house the SEC-506 conversation specs on the spec slice
Jul 17, 2026
5654153
Echo: surface a failed message send instead of swallowing it
Jul 17, 2026
33813a4
run initBehaviors on turbo:frame-load so ComboBox works in lazy frames
MattBudz Jul 20, 2026
71a01b6
Echo: restore new-conversation-link spec naming lost when flattening …
Jul 22, 2026
232a0ab
move CHANGELOG entries into the top/new section
MattBudz Aug 3, 2026
4a10c32
Echo: retire the legacy Roslin one-shot interaction path
dradis-bot Jul 16, 2026
d03a40f
Echo: make provider #generate accept messages: only
dradis-bot Jul 16, 2026
2ccb012
Echo: dedupe cable check and harden interactions dispatch
Jul 17, 2026
265142e
Echo: use do...end for multi-line expect blocks in specs
Jul 22, 2026
a811502
de-reference and tighten Echo Sessions code comments
Aug 3, 2026
6a5af5f
Remove /messages path from the anthropic provider
aapomm Aug 4, 2026
dd7e947
Merge branch 'develop' of github.com:dradis/dradis-ce into echo/add-s…
caitmich Aug 4, 2026
9184e95
Echo: use real projects in specs so Pro's CE sync passes
caitmich Aug 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
[v#.#.#] ([month] [YYYY])
- [entity]:
- [future tense verb] [feature]
- Cards: add option to move a task to a different list
- Echo: add multiplayer chat sessions on Issues — start a conversation from a saved prompt, follow up with more messages, and watch Roslin's reply stream live to everyone viewing
- Upgraded gems:
- rails, rails-html-sanitizer, sqlite3, websocket-driver
- Bugs fixes:
- [entity]:
- [future tense verb] [bug fix]
- Echo:
- Preserve line breaks in streamed Ollama responses for models that emit them as standalone tokens
- Remove a stray leading blank line from streamed responses
- Send only completed conversation turns to the AI provider, so a failed or in-progress reply can no longer break the next one
- Show a generic message when a reply fails instead of surfacing the provider's raw error
- Return a graceful error instead of a server error when a chat session is started with a blank prompt
- Bug tracker items:
- [item]
- Echo enhancements:
- [Echo entity]:
- [future tense verb] [Echo enhancement]
- New integrations:
- [integration]
- Integration enhancements:
Expand All @@ -34,10 +34,6 @@ v5.2.0 (July 2026)
- UI: add dark mode support to the login and setup wizard pages
- Upgraded gems:
- concurrent-ruby, crass, faraday, msgpack, net-imap, nokogiri, puma
- Bugs fixes:
- Echo:
- Preserve line breaks in streamed Ollama responses for models that emit them as standalone tokens
- Remove a stray leading blank line from streamed responses

v5.1.0 (May 2026)
- DataTables: add sticky table toolbar that tracks below the navigation bar when scrolling
Expand Down
6 changes: 6 additions & 0 deletions app/assets/javascripts/hera/behaviors.js
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,12 @@ document.addEventListener('turbo:load', function () {
initBehaviors(document.querySelector('body'));
});

// Native <turbo-frame> navigations (including loading="lazy") don't fire
// turbo:load
document.addEventListener('turbo:frame-load', function (event) {
initBehaviors(event.target);
});

// Because this is an event and not a data-driven behavior, we can leave it
// out of initBehaviors and attach the listener to document directly.
//
Expand Down
2 changes: 2 additions & 0 deletions app/assets/stylesheets/hera/themes.scss
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
@mixin dark-theme {
// Backgrounds
--brand-bg: #{$brand-500};
--brand-fg: #{$white};
--nav-active-bg: #{$brand-600};
--primary-bg: #{$grey-900};
--primary-bg-subtle: #{$grey-800};
Expand Down Expand Up @@ -105,6 +106,7 @@
:root {
// Backgrounds
--brand-bg: #{$brand-500};
--brand-fg: #{$white};
--nav-active-bg: #{$brand-500};
--primary-bg: #{$white};
--primary-bg-subtle: #{darken($white, 1%)}; // darken($primary-bg, 1%)
Expand Down
4 changes: 4 additions & 0 deletions app/assets/stylesheets/hera/utilities.scss
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
.field-sizing-content {
field-sizing: content;
}

.font-light {
font-family: 'ProximaNovaLight', 'system-ui';
}
Expand Down
2 changes: 1 addition & 1 deletion app/jobs/application_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class ApplicationJob < ActiveJob::Base
# retry_on ActiveRecord::Deadlocked

# Most jobs are safe to ignore if the underlying records are no longer available
# discard_on ActiveJob::DeserializationError
discard_on ActiveJob::DeserializationError

before_perform do |job|
ActiveRecord::Base.connection_handler.clear_active_connections!
Expand Down
6 changes: 6 additions & 0 deletions config/environments/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@

config.assets.precompile += %w( hera/test.css hera/test.js )

# Turbo Stream broadcasts render partials outside a request (e.g. Echo's live
# session transcript), where the Sprockets middleware environment isn't in
# scope. With assets compiled on demand in test, resolve them lazily instead
# of failing the strict "precompiled?" check that only makes sense in prod.
config.assets.check_precompiled_asset = false

# Raises error for missing translations.
# config.i18n.raise_on_missing_translations = true

Expand Down
36 changes: 35 additions & 1 deletion db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

//= link controllers/dradis/plugins/echo/agent_controller.js
//= link controllers/dradis/plugins/echo/grammar_controller.js
//= link controllers/dradis/plugins/echo/prompt_controller.js
//= link controllers/dradis/plugins/echo/prompt_selector_controller.js
//= link controllers/dradis/plugins/echo/session_controller.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//= require dradis/plugins/echo/grammar
//= require dradis/plugins/echo/prompts
//= require dradis/plugins/echo/providers
//= require dradis/plugins/echo/sessions
Loading
Loading