Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
e9fc7d4
- add init client expert chat api client
cstns Apr 16, 2026
e3e8011
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 16, 2026
3e52e26
handle on connect topic subscription with wildcards and sessionId wat…
cstns Apr 17, 2026
a2b2996
extract expert mqtt topic methods into a distinct helper
cstns Apr 17, 2026
3650a81
renale automation to something more explicit
cstns Apr 17, 2026
9c9388a
rename automation to something more explicit
cstns Apr 17, 2026
ab9fd9b
Merge remote-tracking branch 'origin/expert/switch-insights-to-mqtt' …
cstns Apr 17, 2026
51c0aed
store inflight request to an agent payload as a resolver to track pen…
cstns Apr 17, 2026
3b6bea8
rename topic helper methods
cstns Apr 17, 2026
ad2e386
extend parsed topic and add example topics
cstns Apr 17, 2026
9b8644b
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 17, 2026
92ebe8a
Merge remote-tracking branch 'origin/expert/switch-insights-to-mqtt' …
cstns Apr 17, 2026
3668bcd
fix missing immersive entity id when sending postMessages to nr-asistant
cstns Apr 17, 2026
05bc0c3
fix subscribing to inflightTopics, handle reconnect done but with a b…
cstns Apr 17, 2026
f1f63c8
Add pendingRequests to product assistant store for managing asynchron…
Steve-Mcl Apr 20, 2026
d71d892
Handle responses for in-flight requests and add invokeActionAwaitResp…
Steve-Mcl Apr 20, 2026
e58ac9f
Use invoke await to ensure assistant transaction is correlated
Steve-Mcl Apr 20, 2026
54bd46e
Enable TeamBroker for pre-staging
hardillb Apr 20, 2026
3c2c0ed
increase sendMessage await timeout
cstns Apr 20, 2026
636b76f
disjoint onEvent callbacks to avoid recursion
cstns Apr 20, 2026
169a3e7
update the loading indicator to take mqtt inflight requests, update t…
cstns Apr 20, 2026
f99c1b9
stop inflight mqtt requests
cstns Apr 21, 2026
8b45ba6
stop inflight mqtt requests
cstns Apr 21, 2026
3eba777
add expert:status-messages into the inFlightUpdates payload for more …
cstns Apr 21, 2026
a2c40ad
prioritize status over tool name
Steve-Mcl Apr 21, 2026
7cc8e71
Fix lint for unused type
Steve-Mcl Apr 21, 2026
051bf0a
clear inflight updates after mqtt response
cstns Apr 21, 2026
e551de6
improve table styling for md tables in ai responses
cstns Apr 21, 2026
7288231
makes the tool list scrollable and expandable, a max length of 5 when…
cstns Apr 21, 2026
5540ddb
extract the tool call item into self contained vue component to adher…
cstns Apr 21, 2026
024a47b
adds a hidden download chat functionality when pressing ctrl+alt+delete
cstns Apr 21, 2026
6b35885
fix race condition when restarting the session
cstns Apr 21, 2026
c6cdf03
move the tool call duration in the tool call title
cstns Apr 21, 2026
1d4d20f
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
Steve-Mcl Apr 21, 2026
f721033
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 21, 2026
10d2c72
remove code block border/padding from agent responses
cstns Apr 21, 2026
26f280a
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 21, 2026
022ce9f
qf linting error
cstns Apr 22, 2026
6fe946d
rename store props for clarity and fix fe unit tests
cstns Apr 22, 2026
468cf32
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 28, 2026
ef2dd51
Refactor in-flight request handling logic to improve code clarity
cstns Apr 28, 2026
4d72847
Simplify message handling logic and improve readability in hydrateMes…
cstns Apr 28, 2026
5151312
Adjust keyboard shortcut modifier detection for cross-platform compat…
cstns Apr 29, 2026
cd8e0d1
set contextual device when in immersive
cstns Apr 29, 2026
4891a18
Adjust keyboard shortcut to use Shift + Alt + d for consistency acros…
cstns Apr 29, 2026
596d5d8
Merge branch 'refs/heads/expert-agent-creds-fe' into expert/switch-in…
cstns Apr 30, 2026
766cb5f
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 30, 2026
9fc0536
qf expert chat selection pills overflowing input
cstns Apr 30, 2026
5e47530
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 30, 2026
55e642b
Refactor correlationData handling in MQTT calls and update types for …
cstns Apr 30, 2026
440d911
Merge remote-tracking branch 'origin/expert/switch-insights-to-mqtt' …
cstns Apr 30, 2026
f8f20e7
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 30, 2026
dc6ab14
merge fixes
cstns Apr 30, 2026
bbc94e8
Enhance MQTT reconnect logic and client management, make `_` methods …
cstns Apr 30, 2026
501b4fd
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 30, 2026
b517dc2
Merge remote-tracking branch 'origin/expert/switch-insights-to-mqtt' …
cstns Apr 30, 2026
72d46bf
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
cstns Apr 30, 2026
4d8d6b9
Merge remote-tracking branch 'origin/expert/switch-insights-to-mqtt' …
cstns Apr 30, 2026
d944908
wire in posthog feature flags to gate the expert mqtt connection
cstns Apr 30, 2026
f17fb15
Expand MQTT service event handlers and add categorized error code sets
cstns Apr 30, 2026
b25072b
Refactor MQTT error management, enhance reconnect logic, and improve …
cstns Apr 30, 2026
d34bf61
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
Steve-Mcl May 1, 2026
384fa7e
Merge branch 'expert-agent-creds-fe' into expert/switch-insights-to-mqtt
Steve-Mcl May 2, 2026
93e700c
Enable telemetry with PostHog integration in CI configuration
cstns May 4, 2026
486e1f1
Cast `projectCount` to integer in ProjectTemplate views to ensure con…
cstns May 4, 2026
7228b82
Read posthog secret from 1password for pre-staging
May 4, 2026
7d0c696
Merge remote-tracking branch 'origin/expert/switch-insights-to-mqtt' …
cstns May 5, 2026
311ddee
Update MQTT keepalive interval from 10 to 45 seconds
cstns May 5, 2026
a054fb4
Fix temporary posthog config for pre-staging env
May 5, 2026
27aeb2f
Wire in PostHog feature flags for gating admin functionality
cstns May 5, 2026
a875fd5
Apply suggestion from @Steve-Mcl
Steve-Mcl May 6, 2026
2d6b9f5
Apply suggestion from @Steve-Mcl
Steve-Mcl May 6, 2026
06414d4
Apply suggestion from @Steve-Mcl
Steve-Mcl May 6, 2026
617bb17
revert temp ci changes
Steve-Mcl May 6, 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
2 changes: 1 addition & 1 deletion ci/ci-values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,4 @@ postgresql:
- "management"

ingress:
className: traefik
className: traefik
4 changes: 2 additions & 2 deletions forge/db/views/ProjectTemplate.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module.exports = function (app) {
name: result.name,
description: result.description,
active: result.active,
instanceCount: result.projectCount,
instanceCount: parseInt(result.projectCount) || 0,
settings: result.settings || {},
policy: result.policy || {},
createdAt: result.createdAt,
Expand Down Expand Up @@ -56,7 +56,7 @@ module.exports = function (app) {
name: result.name,
description: result.description,
active: result.active,
instanceCount: result.projectCount,
instanceCount: parseInt(result.projectCount) || 0,
createdAt: result.createdAt,
links: result.links
}
Expand Down
6 changes: 5 additions & 1 deletion frontend/src/api/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,9 @@ const disableMFA = async () => {
const verifyMFA = async (token) => {
return client.put('/api/v1/user/mfa/verify', { token }).then(res => res.data)
}
const initiateExpertChat = async ({ sessionId }) => {
return client.post('/api/v1/user/expert-creds', { sessionId }).then(res => res.data)
}

export default {
registerUser,
Expand Down Expand Up @@ -267,5 +270,6 @@ export default {
updatePersonalAccessToken,
enableMFA,
verifyMFA,
disableMFA
disableMFA,
initiateExpertChat
}
4 changes: 3 additions & 1 deletion frontend/src/components/expert/Expert.vue
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,8 @@ export default {
'setAgentMode',
'setAbortController',
'resetSessionTimer',
'addWelcomeMessageIfNeeded'
'addWelcomeMessageIfNeeded',
'stopInflightChat'
]),
...mapActions(useProductExpertInsightsAgentStore, ['getCapabilities']),
...mapActions(useProductAssistantStore, ['reset']),
Expand All @@ -157,6 +158,7 @@ export default {
this.abortController.abort()
this.setAbortController(null)
}
this.stopInflightChat()
},
handleScroll () {
// Debounce scroll detection
Expand Down
12 changes: 6 additions & 6 deletions frontend/src/components/expert/components/ExpertChatInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
/>

<div class="actions">
<div class="left">
<div class="left overflow-hidden">
<context-selector v-if="isImmersive && !isInsightsAgent" />
</div>

Expand Down Expand Up @@ -64,13 +64,13 @@
<script>
import { mapActions, mapState } from 'pinia'

import { useResizingHelper } from '../../../composables/ResizingHelper.js'

import ResizeBar from '../../ResizeBar.vue'

import CapabilitiesSelector from './CapabilitiesSelector.vue'
import ContextSelector from './context-selection/index.vue'

import { useResizingHelper } from '@/composables/ResizingHelper.js'

import { useProductAssistantStore } from '@/stores/product-assistant.js'
import { useProductExpertStore } from '@/stores/product-expert.js'
import { useUxDrawersStore } from '@/stores/ux-drawers.js'
Expand Down Expand Up @@ -113,8 +113,8 @@ export default {
},
computed: {
...mapState(useProductAssistantStore, [
'immersiveInstance',
'immersiveDevice'
'isImmersiveInstance',
'isImmersiveDevice'
]),
...mapState(useUxDrawersStore, ['rightDrawer']),
...mapState(useProductExpertStore, [
Expand Down Expand Up @@ -145,7 +145,7 @@ export default {
: 'Tell us what you need help with'
},
isImmersive () {
return this.immersiveDevice || this.immersiveInstance
return this.isImmersiveDevice || this.isImmersiveInstance
}
},
mounted () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,12 @@ export default {
}
},
computed: {
...mapState(useProductExpertStore, ['loadingVariant']),
...mapState(useProductExpertStore, ['loadingVariant', 'inFlightUpdates']),
messages () {
if (this.inFlightUpdates.length > 0) {
return this.inFlightUpdates
}

return this.messageVariants[this.loadingVariant]
},
currentMessage () {
Expand Down
9 changes: 9 additions & 0 deletions frontend/src/components/expert/components/ExpertMessages.vue
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import AiMessage from './messages/AiMessage.vue'
import HumanMessage from './messages/HumanMessage.vue'
import SystemMessage from './messages/SystemMessage.vue'

import { downloadData } from '@/composables/Download.js'
import { useProductExpertStore } from '@/stores/product-expert.js'

export default {
Expand All @@ -46,11 +47,19 @@ export default {
},
mounted () {
this.mountResizeObserver()
window.addEventListener('keydown', this.onKeyDown)
},
beforeUnmount () {
this.unmountResizeObserver()
window.removeEventListener('keydown', this.onKeyDown)
},
methods: {
onKeyDown (e) {
if (e.altKey && e.shiftKey && e.key.toLowerCase() === 'd') {
e.preventDefault()
downloadData(this.messages, 'expert-messages.json')
}
},
mountResizeObserver () {
const el = this.$refs.messagesWrapper
if (!el) return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@
</template>

<script>
import useStreamingList from '../../../../composables/StreamingListHelper.js'
import { slugify } from '../../../../composables/strings/String.js'

import AnswerWrapper from './components/AnswerWrapper.vue'

import ToolCalls from './components/ToolCalls.vue'

import useStreamingList from '@/composables/StreamingListHelper.js'
import { slugify } from '@/composables/strings/String.js'

export default {
name: 'AiMessage',
components: { ToolCalls, AnswerWrapper },
Expand Down
Loading
Loading