gadget/gadget-code/src/models/chat-session.ts
2026-04-28 09:20:37 -04:00

67 lines
2.0 KiB
TypeScript

// src/models/chat-session.ts
// Copyright (C) 2026 Robert Colbert <rob.colbert@openplatform.us>
// All Rights Reserved
import { Types, Schema, Document, model } from "mongoose";
import { IUser } from "./user.js";
import { IProject } from "./project.js";
export enum ChatSessionMode {
Plan = "plan", // for planning and brainstorming
Build = "build", // for building and coding
Test = "test", // for testing and debugging
Ship = "ship", // for finalizing and shipping
Develop = "dev", // for working on the Gadget Code harness itself
}
export interface IChatSessionPin {
_id?: Types.ObjectId;
content: string;
}
export const ChatSessionPinSchema = new Schema<IChatSessionPin>({
content: { type: String, required: true },
});
export interface IChatSession extends Document {
createdAt: Date;
lastMessageAt?: Date;
user: IUser | Types.ObjectId;
project: IProject | Types.ObjectId;
name: string;
mode: ChatSessionMode;
stats: {
turnCount: number;
toolCallCount: number;
inputTokens: number;
outputTokens: number;
};
pins: IChatSessionPin[];
}
export const ChatSessionSchema = new Schema<IChatSession>({
createdAt: { type: Date, default: Date.now, required: true },
lastMessageAt: { type: Date },
user: { type: Types.ObjectId, required: true, index: 1, ref: "User" },
project: { type: Types.ObjectId, required: false, index: 1, ref: "Project" },
name: { type: String, default: "New Session", required: true },
mode: {
type: String,
enum: ChatSessionMode,
default: ChatSessionMode.Build,
required: true,
},
stats: {
turnCount: { type: Number, default: 0, required: true },
toolCallCount: { type: Number, default: 0, required: true },
inputTokens: { type: Number, default: 0, required: true },
outputTokens: { type: Number, default: 0, required: true },
},
pins: { type: [ChatSessionPinSchema], default: [], required: true },
});
export const ChatSession = model<IChatSession>(
"ChatSession",
ChatSessionSchema,
);
export default ChatSession;