Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
29a7c6a
Add persistent docked ChatGXY side panel
dannon Mar 12, 2026
06231a4
Add active interface context awareness to docked ChatGXY panel
dannon Mar 12, 2026
334c355
Add additional ChatGXY placement options
guerler Mar 11, 2026
71197b6
Make full-screen /chatgxy the default activity bar action
dannon Mar 13, 2026
85dac2c
Clean up ChatGXY panel code after review
dannon Mar 13, 2026
a06c412
Unify ChatGXY panel state with persistent location preference
dannon Mar 13, 2026
719fe8f
Fix ActivityBar test mock to include useRouter
dannon Mar 14, 2026
29fe470
Fix three bugs found in self-review
dannon Mar 18, 2026
a0e9e8c
Add tests for useActiveContext composable and chatStore
dannon Mar 26, 2026
9980ac9
Fix bugs and clean up code found in self-review
dannon Mar 27, 2026
a841bcb
Add @mention support for datasets and histories in ChatGXY
dannon Apr 2, 2026
df067a3
Clean up @mention code after self-review
dannon Apr 4, 2026
2261d03
Fix typo in DEFAULT_PROMPT and drop misleading async from resolveMent…
dannon Apr 6, 2026
bb9bcaf
Drop unused file_size and dataset_count from EntityReference
dannon Apr 23, 2026
a38b742
Use safe_loads for chat context JSON parsing
dannon Apr 23, 2026
00e3644
Render entity mentions with a Vue template instead of v-html
dannon Apr 23, 2026
12d72d0
Collapse ChatGXY dock handlers into a single dockTo(location) function
dannon Apr 23, 2026
a0c88b7
Merge MentionDropdown position watchers
dannon Apr 23, 2026
c0ccb13
Guard chatStore setters against no-op updates
dannon Apr 23, 2026
2f2cd73
Rename tool_id to job_tool_id in the job branch of _format_interface_…
dannon Apr 23, 2026
3827d0e
Add tests for agent prompt context formatters
dannon Apr 29, 2026
b90ffa4
Sanitize entity context fields to prevent prompt injection
dannon Apr 29, 2026
338b7c4
Test resolveMentions store-driven resolution paths
dannon Apr 29, 2026
c65f94d
Propagate ChatGXY entity context through router
dannon Apr 30, 2026
e798075
Clear docked ChatGXY state for new chats
dannon Apr 30, 2026
780e7f0
Let empty mention dropdown release Enter
dannon Apr 30, 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
42 changes: 42 additions & 0 deletions client/src/api/schema/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8218,6 +8218,13 @@ export interface components {
} & {
[key: string]: unknown;
};
/** ChatEntityContext */
ChatEntityContext: {
/** Datasets */
datasets?: components["schemas"]["EntityReference"][];
/** Histories */
histories?: components["schemas"]["EntityReference"][];
};
/** ChatExchangeBatchDeletePayload */
ChatExchangeBatchDeletePayload: {
/**
Expand Down Expand Up @@ -8252,6 +8259,11 @@ export interface components {
* @default
*/
context: string | null;
/**
* Entity Context
* @description Structured entity references resolved from @mentions in the query.
*/
entity_context?: components["schemas"]["ChatEntityContext"] | null;
/**
* Exchange ID
* @description The ID of an existing chat exchange to continue.
Expand Down Expand Up @@ -12016,6 +12028,36 @@ export interface components {
*/
src: components["schemas"]["DataItemSourceType"];
};
/** EntityReference */
EntityReference: {
/** Extension */
extension?: string | null;
/** HID */
hid?: number | null;
/**
* Entity ID
* @description The resolved encoded ID of the entity.
*/
id?: string | null;
/**
* Identifier
* @description The identifier as typed by the user (HID number or name).
*/
identifier: string;
/**
* Name
* @description The display name of the entity.
* @default
*/
name: string;
/** State */
state?: string | null;
/**
* Entity Type
* @description The type of entity being referenced (e.g. 'dataset', 'history').
*/
type: string;
};
/** ExitCodeJobMessage */
ExitCodeJobMessage: {
/** Code Desc */
Expand Down
1 change: 1 addition & 0 deletions client/src/components/ActivityBar/ActivityBar.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ vi.mock("@/composables/config", () => ({

vi.mock("vue-router/composables", () => ({
useRoute: vi.fn(() => ({})),
useRouter: vi.fn(() => ({ push: vi.fn() })),
}));

const { server, http } = useServerMock();
Expand Down
31 changes: 30 additions & 1 deletion client/src/components/ActivityBar/ActivityBar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ import { faBell, faEllipsisH, faUserCog } from "@fortawesome/free-solid-svg-icon
import { watchImmediate } from "@vueuse/core";
import { storeToRefs } from "pinia";
import { computed, type Ref, ref } from "vue";
import { useRoute } from "vue-router/composables";
import { useRoute, useRouter } from "vue-router/composables";
import draggable from "vuedraggable";

import { useConfig } from "@/composables/config";
import { convertDropData } from "@/stores/activitySetup";
import { useActivityStore } from "@/stores/activityStore";
import type { Activity } from "@/stores/activityStoreTypes";
import { useChatStore } from "@/stores/chatStore";
import { useEventStore } from "@/stores/eventStore";
import { useUnprivilegedToolStore } from "@/stores/unprivilegedToolStore";
import { useUserStore } from "@/stores/userStore";
Expand Down Expand Up @@ -78,7 +79,9 @@ const DRAG_DELAY = 50;
const { config, isConfigLoaded } = useConfig();

const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const chatStore = useChatStore();

const eventStore = useEventStore();
const activityStore = useActivityStore(props.activityBarId);
Expand Down Expand Up @@ -173,6 +176,9 @@ function isActiveSideBar(menuKey: string) {
* Checks if an activity that has a panel should have the `is-active` prop
*/
function panelActivityIsActive(activity: Activity) {
if (activity.id === "chatgxy" && !chatStore.isCenterMode && chatStore.chatVisible) {
return true;
}
return isActiveSideBar(activity.id) || isActiveRoute(activity.to);
}

Expand Down Expand Up @@ -232,6 +238,19 @@ function toggleSidebar(toggle: string = "", to: string | null = null) {
activityStore.toggleSideBar(toggle);
}

function onChatGxyClick() {
if (chatStore.isCenterMode) {
toggleSidebar("chatgxy");
if (route.path.startsWith("/chatgxy")) {
router.push("/");
} else {
router.push("/chatgxy");
}
} else {
chatStore.toggleChat();
}
}

function onActivityClicked(activity: Activity) {
if (activity.click) {
emit("activityClicked", activity.id);
Expand Down Expand Up @@ -301,6 +320,16 @@ defineExpose({
:tooltip="activity.tooltip"
:to="activity.to"
@click="toggleSidebar(activity.id, activity.to)" />
<ActivityItem
v-else-if="activity.id === 'chatgxy'"
:id="`${activity.id}`"
:key="activity.id"
:activity-bar-id="props.activityBarId"
:icon="activity.icon"
:is-active="panelActivityIsActive(activity)"
:title="activity.title"
:tooltip="activity.tooltip"
@click="onChatGxyClick" />
<ActivityItem
v-else-if="activity.panel"
:id="`${activity.id}`"
Expand Down
Loading
Loading