114 lines
5.7 KiB
JavaScript
114 lines
5.7 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.AssistantSessionStore = void 0;
|
|
const nanoid_1 = require("nanoid");
|
|
const config_1 = require("../config");
|
|
const investigationState_1 = require("./investigationState");
|
|
const addressNavigationState_1 = require("./addressNavigationState");
|
|
const MAX_ITEMS_PER_SESSION = 200;
|
|
function cloneItem(item) {
|
|
return {
|
|
...item,
|
|
debug: item.debug ? { ...item.debug } : null
|
|
};
|
|
}
|
|
function cloneSession(state) {
|
|
return {
|
|
session_id: state.session_id,
|
|
updated_at: state.updated_at,
|
|
items: state.items.map(cloneItem),
|
|
investigation_state: (0, investigationState_1.cloneInvestigationState)(state.investigation_state),
|
|
address_navigation_state: (0, addressNavigationState_1.cloneAddressNavigationState)(state.address_navigation_state)
|
|
};
|
|
}
|
|
function normalizeSessionShape(state) {
|
|
const legacy = state;
|
|
const normalizedItems = Array.isArray(legacy.items) ? legacy.items : [];
|
|
const investigationState = config_1.FEATURE_ASSISTANT_INVESTIGATION_STATE_V1
|
|
? legacy.investigation_state ?? (0, investigationState_1.createEmptyInvestigationState)(state.session_id)
|
|
: legacy.investigation_state ?? null;
|
|
const addressNavigationState = config_1.FEATURE_ASSISTANT_ADDRESS_NAVIGATION_STATE_V1
|
|
? (0, addressNavigationState_1.normalizeAddressNavigationState)(legacy.address_navigation_state ?? (0, addressNavigationState_1.createEmptyAddressNavigationState)(state.session_id), state.session_id)
|
|
: legacy.address_navigation_state ?? null;
|
|
state.items = normalizedItems;
|
|
state.updated_at = typeof legacy.updated_at === "string" && legacy.updated_at.trim() ? legacy.updated_at : new Date().toISOString();
|
|
state.investigation_state = investigationState;
|
|
state.address_navigation_state = addressNavigationState;
|
|
return state;
|
|
}
|
|
class AssistantSessionStore {
|
|
sessions = new Map();
|
|
ensureSession(sessionId) {
|
|
const resolvedId = (sessionId ?? "").trim() || `asst-${(0, nanoid_1.nanoid)(10)}`;
|
|
const existing = this.sessions.get(resolvedId);
|
|
if (existing) {
|
|
return cloneSession(normalizeSessionShape(existing));
|
|
}
|
|
const created = {
|
|
session_id: resolvedId,
|
|
updated_at: new Date().toISOString(),
|
|
items: [],
|
|
investigation_state: config_1.FEATURE_ASSISTANT_INVESTIGATION_STATE_V1 ? (0, investigationState_1.createEmptyInvestigationState)(resolvedId) : null,
|
|
address_navigation_state: config_1.FEATURE_ASSISTANT_ADDRESS_NAVIGATION_STATE_V1 ? (0, addressNavigationState_1.createEmptyAddressNavigationState)(resolvedId) : null
|
|
};
|
|
this.sessions.set(resolvedId, created);
|
|
return cloneSession(created);
|
|
}
|
|
appendItem(sessionId, item) {
|
|
const session = this.ensureMutableSession(sessionId);
|
|
session.items.push(item);
|
|
if (session.items.length > MAX_ITEMS_PER_SESSION) {
|
|
session.items = session.items.slice(session.items.length - MAX_ITEMS_PER_SESSION);
|
|
}
|
|
if (config_1.FEATURE_ASSISTANT_ADDRESS_NAVIGATION_STATE_V1) {
|
|
const baseNavigationState = (0, addressNavigationState_1.normalizeAddressNavigationState)(session.address_navigation_state, sessionId);
|
|
session.address_navigation_state = (0, addressNavigationState_1.evolveAddressNavigationStateWithAssistantItem)(baseNavigationState, item, Math.max(0, session.items.length - 1));
|
|
}
|
|
session.updated_at = new Date().toISOString();
|
|
return cloneItem(item);
|
|
}
|
|
getSession(sessionId) {
|
|
const found = this.sessions.get(sessionId);
|
|
return found ? cloneSession(normalizeSessionShape(found)) : null;
|
|
}
|
|
setInvestigationState(sessionId, state) {
|
|
const session = this.ensureMutableSession(sessionId);
|
|
session.investigation_state = (0, investigationState_1.cloneInvestigationState)(state);
|
|
session.updated_at = new Date().toISOString();
|
|
return (0, investigationState_1.cloneInvestigationState)(session.investigation_state);
|
|
}
|
|
getAddressNavigationState(sessionId) {
|
|
const session = this.ensureMutableSession(sessionId);
|
|
if (!config_1.FEATURE_ASSISTANT_ADDRESS_NAVIGATION_STATE_V1) {
|
|
return null;
|
|
}
|
|
return (0, addressNavigationState_1.cloneAddressNavigationState)(session.address_navigation_state);
|
|
}
|
|
setAddressNavigationState(sessionId, state) {
|
|
const session = this.ensureMutableSession(sessionId);
|
|
if (!config_1.FEATURE_ASSISTANT_ADDRESS_NAVIGATION_STATE_V1) {
|
|
session.address_navigation_state = null;
|
|
return null;
|
|
}
|
|
session.address_navigation_state = (0, addressNavigationState_1.normalizeAddressNavigationState)(state, sessionId);
|
|
session.updated_at = new Date().toISOString();
|
|
return (0, addressNavigationState_1.cloneAddressNavigationState)(session.address_navigation_state);
|
|
}
|
|
ensureMutableSession(sessionId) {
|
|
const existing = this.sessions.get(sessionId);
|
|
if (existing) {
|
|
return normalizeSessionShape(existing);
|
|
}
|
|
const created = {
|
|
session_id: sessionId,
|
|
updated_at: new Date().toISOString(),
|
|
items: [],
|
|
investigation_state: config_1.FEATURE_ASSISTANT_INVESTIGATION_STATE_V1 ? (0, investigationState_1.createEmptyInvestigationState)(sessionId) : null,
|
|
address_navigation_state: config_1.FEATURE_ASSISTANT_ADDRESS_NAVIGATION_STATE_V1 ? (0, addressNavigationState_1.createEmptyAddressNavigationState)(sessionId) : null
|
|
};
|
|
this.sessions.set(sessionId, created);
|
|
return created;
|
|
}
|
|
}
|
|
exports.AssistantSessionStore = AssistantSessionStore;
|