| import {
|
| addAssistantMessage,
|
| addAssistantAction,
|
| addUserMessage,
|
| addErrorMessage,
|
| } from "#/state/chat-slice";
|
| import { appendSecurityAnalyzerInput } from "#/state/security-analyzer-slice";
|
| import { setCode, setActiveFilepath } from "#/state/code-slice";
|
| import { appendJupyterInput } from "#/state/jupyter-slice";
|
| import { setCurStatusMessage } from "#/state/status-slice";
|
| import store from "#/store";
|
| import ActionType from "#/types/action-type";
|
| import {
|
| ActionMessage,
|
| ObservationMessage,
|
| StatusMessage,
|
| } from "#/types/message";
|
| import { handleObservationMessage } from "./observations";
|
| import { appendInput } from "#/state/command-slice";
|
|
|
| const messageActions = {
|
| [ActionType.BROWSE]: (message: ActionMessage) => {
|
| if (!message.args.thought && message.message) {
|
| store.dispatch(addAssistantMessage(message.message));
|
| }
|
| },
|
| [ActionType.BROWSE_INTERACTIVE]: (message: ActionMessage) => {
|
| if (!message.args.thought && message.message) {
|
| store.dispatch(addAssistantMessage(message.message));
|
| }
|
| },
|
| [ActionType.WRITE]: (message: ActionMessage) => {
|
| const { path, content } = message.args;
|
| store.dispatch(setActiveFilepath(path));
|
| store.dispatch(setCode(content));
|
| },
|
| [ActionType.MESSAGE]: (message: ActionMessage) => {
|
| if (message.source === "user") {
|
| store.dispatch(
|
| addUserMessage({
|
| content: message.args.content,
|
| imageUrls:
|
| typeof message.args.image_urls === "string"
|
| ? [message.args.image_urls]
|
| : message.args.image_urls,
|
| timestamp: message.timestamp,
|
| pending: false,
|
| }),
|
| );
|
| } else {
|
| store.dispatch(addAssistantMessage(message.args.content));
|
| }
|
| },
|
| [ActionType.RUN_IPYTHON]: (message: ActionMessage) => {
|
| if (message.args.confirmation_state !== "rejected") {
|
| store.dispatch(appendJupyterInput(message.args.code));
|
| }
|
| },
|
| };
|
|
|
| export function handleActionMessage(message: ActionMessage) {
|
| if (message.args?.hidden) {
|
| return;
|
| }
|
|
|
| if (message.action === ActionType.RUN) {
|
| store.dispatch(appendInput(message.args.command));
|
| }
|
|
|
| if ("args" in message && "security_risk" in message.args) {
|
| store.dispatch(appendSecurityAnalyzerInput(message));
|
| }
|
|
|
| if (message.source === "agent") {
|
| if (message.args && message.args.thought) {
|
| store.dispatch(addAssistantMessage(message.args.thought));
|
| }
|
|
|
|
|
| store.dispatch(addAssistantAction(message));
|
| }
|
|
|
| if (message.action in messageActions) {
|
| const actionFn =
|
| messageActions[message.action as keyof typeof messageActions];
|
| actionFn(message);
|
| }
|
| }
|
|
|
| export function handleStatusMessage(message: StatusMessage) {
|
| if (message.type === "info") {
|
| store.dispatch(
|
| setCurStatusMessage({
|
| ...message,
|
| }),
|
| );
|
| } else if (message.type === "error") {
|
| store.dispatch(
|
| addErrorMessage({
|
| ...message,
|
| }),
|
| );
|
| }
|
| }
|
|
|
| export function handleAssistantMessage(message: Record<string, unknown>) {
|
| if (message.action) {
|
| handleActionMessage(message as unknown as ActionMessage);
|
| } else if (message.observation) {
|
| handleObservationMessage(message as unknown as ObservationMessage);
|
| } else if (message.status_update) {
|
| handleStatusMessage(message as unknown as StatusMessage);
|
| } else {
|
| store.dispatch(
|
| addErrorMessage({
|
| message: "Unknown message type received",
|
| }),
|
| );
|
| }
|
| }
|
|
|